İlkay İlknur

just a developer...

Kocaeli Üniversitesi Bilişim Günleri 2012

Merhabalar, 16 Mayıs tarihinde Kocaeli Üniversitesi'nin düzenlemiş olduğu Bilişim Günlerinin 2. gününde C# 5.0 isimli bir oturumum oluyor olacak. Yakınlarda bulunan herkesi 2 gün sürecek olan etkinliğe beklerim.

Görüşmek Üzere



Trakya Üniversitesi Yazılım Şenliği Ardından

Merhaba Arkadaşlar,

Nisan ayında katıldığım bir başka etkinlik te Trakya Üniversitesi Yazılım Şenliği'ydi. Isparta'dan sonra katıldığım 2. üniversite semineri olan bu seminerde açıkcası beklentilerim oldukça yüksekti ;) Neden mi ? detaylar birazdan...

İlk günü benim C# 5.0 sunumumla açtık. Açıkcası günün ilk ve tek Visual Studio açılan oturumuydu. Bu oturumda C# 5.0 'dan ve Project Roslyn'den bahsederek oturumu tamamladım. Gün içerisinde ise Burak Selim Şenyurt ve Ercan Bozkurt'ta sunumlarını tamamladılar ve ilk günü bu şekilde bitirdik demek isterdim ama Trakya Üniversitesin'deki arkadaşlar o kadar güzel bir etkinlik hazırlamışlar ki hemen hemen her detayı düşünmüşler. :)  Önce tabi ki hazır Edirne'ye gitmişken ciğerimizi yedik ve süper bir Edirne turu yaptık.

İkinci güne ise workshoplarla başlamak yerine Edirne kent ormanı içerisinde süper bir kahvaltı yaparak güne başladık :)  ve daha sonra workshopların yapılacağı yere doğru yola çıktık. Workshoplar için ajanda biraz sarkarak ta olsa başladı ve saat akşam 20:30'a kadar workshoplara devam ettik.

İkinci gün sonunda saat 20:30'da Edirne'den yola çıkarken yüzümüzde gülümseme aklımızda da güzel anılar vardı. Etkinlik içerisinde büyük bir arkadaş grubunun payı vardı. Tabi ki Trakya Üniversitesi Bilgisayar Mühendisliği Bölüm Başkanı Doç. Dr. Yılmaz Kılıçarslan'a teşekkür etmeden olmaz bizleri süper ağırladılar.

Bunun yanında başta MSP Fevzi Yılmaz'a sonrasında Sezer'e,Cem'e,Melis'e,Elif'e,Merve'ye, Hüseyin'e, Orkun'a ve adını şu an hatırlayamadığım tüm arkadaşlara bizi ağırladıkları için teşekkür ederim. Süperdiniz !



Trakya Üniversitesi Yazılım Şenliği 2012 ve C# 5.0 Oturumum

Merhaba Arkadaşlar, 20-21 Nisan tarihleri arasında Trakya Üniversitesi'nin düzenlediği Yazılım Şenliğinde olacağım. İlk günün açılışında C# 5.0 oturumunu yapıyor olacağım. İkinci gününde ise WinRT ve C# 5.0 konularına uygulamalı olarak workshop ortamında bakıyor olacağız. Yakınlarda bulunan herkesi etkinliğe beklerim.   Bu arada İstanbul'da olanlar için bu hafta Microsoft Türkiye ofisinde Nedirtv seminerleri kapsamında "Bir C# Developerın Perspektifinden WinRT" isimli bir oturumum oluyor olacak. Görüşmek Üzere,


Nedirtv Şubat Webinerleri (Level 300 Özel) ve C# 5.0 Webinerim

Merhaba Arkadaşlar,

Çektiğim görsel dersler ile katkıda bulunduğum nedirtv'nin bu ay düzenlemiş olduğu Level 300 webinerlerinde 23 Şubat'ta "Tüm Yönleriyle C# 5.0 Asenkron Programlama" isimli bir webiner düzenliyor olacağım. Webinerlerin teması level 300 olsada webiner başında en basit örnekler ile başlayıp C# 5.0'ı temelden incelemeye başlayacağız ve seviyemizi yavaş yavaş arttıracağız. Bu nedenle webinere her seviyeden developerlar katılabilir ;)

Şubat Webinerlerinin Programı Şu Şekilde Konu: Veritabanı Yerine Cache'deki Verilerle Çalışmak Zaman: 6 Şubat 2012 Pazartesi 21:00 Konuşmacı: Uğur UMUTLUOĞLU Link: https://www.livemeeting.com/cc/mvp/join?id=TF2CJN&role=attend Konu: Dynamics CRM'e Plugin Yazma Zaman: 13 Şubat 2012 Pazartesi 21:00 Konuşmacı: Barış KANLICA Link: https://www.livemeeting.com/cc/mvp/join?id=T8DDJ7&role=attend Konu: Entity Framework - Migration Zaman: 20 Şubat 2012 Pazartesi 21:00 Konuşmacı: Burak Selim ŞENYURT Link: https://www.livemeeting.com/cc/mvp/join?id=P4P5JG&role=attend Konu: Tüm Yönleriyle C# 5.0 Asenkron Programlama Zaman: 23 Şubat 2012 Perşembe 21:00 Konuşmacı: İlkay İLKNUR Link: https://www.livemeeting.com/cc/mvp/join?id=7H5R69&role=attend Konu: Masaüstü Uygulamasından ASP.NET Sayfalarıyla Etkileşim Zaman: 27 Şubat 2012 Pazartesi 21:00 Konuşmacı: Fatih BOY Link: https://www.livemeeting.com/cc/mvp/join?id=68WBPH&role=attend 23 Şubat'ta Görüşmek Üzere,


Tüm Yönleriyle C# 5.0 Webineri Kaydı

Merhaba Arkadaşlar,

23 Şubat 2012 tarihinde Nedirtv Şubat Ayı özel Level 300 webinerleri kapsamından yapmış olduğum "Tüm Yönleriyle C# 5.0" webinerinin kaydını sizlerle paylaşıyorum.

Webiner süre olarak tahmin ettiğimden biraz daha uzun sürse de (yaklaşık 2 saat kadar :) ) faydalı bir webiner olduğunu düşünüyorum. :)

Webineri kayıt altına alan ve bana ulaştıran Bahtiyar Dilek'e teşekkür ederim.

Mart ayında ise Akdeniz Bölgesinde bir seminerde olacağım. Detaylar  çok yakında... :)

Webineri buradan download edebilirsiniz.

Görüşmek Üzere,



SDÜ Yazılım Zirvesi 2012 - C# 5.0 Oturumum

Merhaba Arkadaşlar,

12-13 Mart Tarihleri arasında Süleyman Demirel Üniversitesi Yazılım Kulübünün  düzenlemiş olduğu Yazılım Zirvesi etkinliğinde C# 5.0 ile ilgili bir oturumum oluyor olacak. Benim haricimde Burak Selim Şenyurt ve Ercan Bozkurt'ta aynı etkinlikte konuşmacı olarak yer alacak. Etkinliğin ikinci gününde ise workshoplar ile yazılım zirvesini sonlandırıyor olacağız.

Etkniliğe kayıt olmak için www.sduyazilim.com/seminer adresini ziyaret edebilirsiniz.



SDU Yazılım Zirvesi 2012’nin Ardından

Merhaba Arkadaşlar,

Blogdan da daha önce duyurusunu yaptığım üzere 12-13 Mart tarihlerinde Burak Selim Şenyurt ve Ercan Bozkurt ile beraber SDU Yazılım Zirvesine katılmak üzere Isparta Süleyman Demirel Üniversitesi’ndeydim.

Özellikle benim için oldukça zor geçen bir hafta sonundan sonra Pazartesi günü sabahın erken saatlerinde Isparta’ya vardım ve sabah kahvaltısının ardından Yazılım Kulübündeki arkadaşlar ile birlikte etkinliğin yapılacağı salona geçtik.

Günün ikinci oturumu olan C# 5.0 oturumunda arkadaşlara C# 5.0 ile beraber gelecek olan yeniliklerden, biraz Windows 8’den ve biraz da Roslyn projesinden bahsettim. Yemek öncesi bu bahsettiğim konular tabi ki biraz ağır geldi :) ancak yemekten sonra da kısa bir süre oturuma devam ederek sunumumu tamamladım.

Birinci günün sonunda ise 3 konuşmacının yer aldığı dinleyicilerin istedikleri soruları özgürce sorabildikleri bir panel ile günü sonlandırdık. Panel içerisinde özellikle diğer konuşmacılara göre en yakın zamanda üniversiteden mezun olmuş biri olarak yaşamış olduğum deneyimlerden arkadaşlara bahsetmem arkadaşların ilgilerini oldukça çektiğini düşünüyorum. Ayrıca özellikle son 6-7 aydır elde etmiş olduğum proje deneyimlerinden de bahsetmem (tamam kabul ediyorum bahsetmekten çok onlarla biraz dertleştik :) ) onları nasıl bir dünyanın beklediği konusunda da biraz fikir sahibi olmaları açısından faydalı olduğunu düşünüyorum.

İkinci gün ise workshop günüydü. Günün ilk workshopı bana aitti ve arkadaşlar ile “Mevcut C# Yeteneklerimizi Üst Sınırlara Çekmek” başlıklı bir workshop gerçekleştirdik.

2 günün sonunda SDU Yazılım Kulübü tarafından muhteşem bir organizasyon yapıldığını da söylemeden edemeyeceğim. Misafirperverlikleri süperdi. Açıkcası bu kadarını beklemiyordum. Özellikle kulüp başkanı Gökhan Kara’ya ve ilk gün sabahın ilk saatlerinde Isparta’ya gelişimden ayrılışıma kadar her zaman yanımızda olan Resul Rıza Dolaner’e teşekkür ederim. Umarım yine ilerleyen zamanlara Isparta’da başka etkinlikler de yaparız.

Kendi açımdan baktığımda ise bu konseptte konuşmacı olarak yer aldığım etkinlikti. Tabi ki eksik noktalarım olmuştur ancak genele baktığımdan kendi açımdan faydalı ve başarılı bir etkinlik olduğunu düşünüyorum.

İlerleyen aylarda başka üniversitelerde ve başka etkinlikler içerisinde de yer alıyor olacağım. Takipte kalın ;) !!



MIX’11 Konferansının Ardından

Merhaba Arkadaşlar,

Her sene merakla beklediğim 2 konferanstan biri olan MIX konferansı (diğeri de PDC) bugün yapılacak oturumlardan sonra sona erecek. Konferansın ilk iki gününün sabahlarında yapılan keynote oturumları ile Microsoft adeta developer araçları konusundaki sessizliğini bozdu ve yaptığı çalışmaları bizlerle paylaştı. Konferansın ilk gününde keynote oturumunda Internet Explorer ekibinin başındaki Dean Hachamovitch ile .NET Platformunun başındaki ScottGu sahnedeyken ikinci günde Windows Phone ekibinin lideri Joe Belfiore ile yine ScottGu sahnedeydi. İlk 2 gün boyunca keynote oturumlarında pek çok gelişmeden bahsedildi ve yeni pek çok ürün kullanıma sunuldu. İsterseniz fazla zaman kaybetmeden yapılan duyurulardan kısaca bahsedelim.

Internet Explorer 10 Platform Preview 1

Yaklaşık 1 ay önce final sürümü çıkan Internet Explorer 9’un gelişmesi hiç durmadan devam ediyor. Yaklaşık 3 haftadır üzerinde geliştirme yapılan Internet Explorer 10 ‘da birinci platform preview sürümü ile yazılım geliştiricilerin kullanımına sunuldu. Özellikle IE9 ile beraber gelen pekçok özellikle ilgi çeken Internet Explorer’ın bu denli hızlı bir şekilde gelişmesi oldukça güzel bir haber. Microsoft’un özellikle HTML 5 ve standartlar konusuna verdiği önemi görmek, bunun yanında da tarayıcının geliştirimini yine yazılım geliştiriciler ile beraber interaktif olarak devam ettirmesi oldukça güzel gelişmeler. IE10 Platform Preview sürümünü http://ie.microsoft.com/testdrive/ bu adresten indirebilir ve bu site üzerinde bulunan uygulamalar ile test edebilirsiniz.

IE10 Platform Preview 1 içerisinde bulunan yeni özellikler ise şunlar

  • CSS3 Flexbox
  • CSS3 Grid Alignment
  • CSS3 Multi-Column
  • CSS3 Gradients on background-images
  • ECMAScript5 Strict Mode

Yapılan duyurulara göre bundan sonra IE10’un gelişimi 10-12 haftalık aralarla yeni platform-preview sürümleri çıkarılarak biz yazılım geliştiricilerle paylaşılmaya devam edecek.

ASP.NET MVC 3 Tools Update

MIX Konferansının ilk gününde yapılan duyurulardan biri de ASP.NET MVC 3 Tools güncellemesiydi. Sadece Visual Studio araçları içerisinde yapılan bu güncellemelerle artık ASP.NET MVC 3 projelerinde HTML 5 kullanmak mümkün hale geldi. Bu güncelleme ile gelen yenilikler ise şu şekilde.

  • ASP.NET MVC 3 projelerinde HTML 5 desteği. Proje yaratımı sırasında HTML 5 seçeneği seçilir ise otomatik olarak yaratılan View’larda semantic HTML 5 tagleri kullanılmakta.
  • Yeni proje yaratma penceresine Intranet uygulama şablonu eklendi. Bu proje şablonu seçildiği durumlarda ASP.NET MVC uygulaması artık Windows Authentication kullanacak şekilde yaratılmakta ve uygulama içerisinde AccountController bulunmamakta.
  • EF 4.1 ile beraber Code-First Development ile geliştirilen model üzerinden Controller ve View’ların full olarak yaratılması özelliği bu güncelleme ile gelmiş durumda. Artık Create, Read, Update, Delete işlemleri için Controller ve View’lar otomatik olarak üretilmekte.
  • NuGet kullanılarak artık Javascript kütüphaneleri de proje içerisinde eklenilebilmekte.
  • Son olarak ise ASP.NET MVC projelerine HTML 5 ve CSS3 kullanımlarında tarayıcılardaki uyumluluk sorunlarıyla daha kolay başaçıkmak için Modernizr 1.7 artık ASP.NET MVC 3 projelerinde yer almakta.

ASP.NET MVC 3 Tools güncellemesine buradan erişebilirsiniz.

Entity Framework 4.1 – Code First Development

Uzun zamandır Code-First Development özelliği ile biz yazılım geliştiricilerin kullanımında olan Entity Framework 4.1’in RTM versiyonu MIX konferansında duyuruldu. Basit olarak  POCO(Plain Old CLR Objects) sınıfları ve sınıflar arasındaki ilişkileri tanımlayarak veritabanının yaratılmasını ve veritabanı tabloları ile uygulama tarafındaki sınıfların eşleştirilmesini sağlayan Code-First Development özelliği EF 4.1 içerisinde yer almakta.

Entity Framework 4.1 güncellemesine buradan erişebilirsiniz.

Visual Studio 2010 Async CTP Refresh

Geçtiğimiz yılın sonunda yapılan PDC konferansında duyurulan C# programlama dilinin bir sonraki versiyonunun temasını oluşturacak olan Asenkron Programlama teması ile ilgili ilk çalışmaların sunulduğu Visual Studio Async CTP bildiğimiz gibi Visual Studio Service Pack 1’in çıkmasıyla çalışamaz duruma gelmişti. MIX konferansında Visual Studio Async CTP Refresh duyuruldu ve yapılan bir takım ek geliştirmeler ve VS 2010 SP1 ile uyumluluk özellikleri ile yazılım geliştiricilere sunuldu.

Visual Studio Async CTP Refresh’e buradan erişebilirsiniz. Yeni refresh sürümü ile beraber gelen yeniliklere(en dikkat çekici yenilik async özelliğinin Windows Phone 7 içerisine gelmesi) ve düzeltmelere her zaman büyük bir ilgiyle takip ettiğim Eric Lippert’ın sitesinden ulaşabilirsiniz. Ayrıca yine Channel 9’da bulunan C# programlama dili Program Manager’ı Mads Torgersen’ın videosunu izleyebilirsiniz.

Windows Phone 7 Mango Update

Windows Phone 7’nin çıkacak olan Mango kod adlı büyük güncellemesinin detayları MIX konferansının ikinci gününde Joe Belfiore tarafından açıklandı. Keynote sırasında dikkatimi çeken yenilikler ise şunlar.

  • Arama ekranları üzerinde pek çok yenilik bulunmakta. Gerek Marketplace entegrasyonu gerekse telefon üzerinde yapılan aramalarda pek çok kolaylık getirilmiş durumda.
  • En çok dikkatimi çeken gelişmelerden biri de Internet Explorer 9’un bu güncelleme ile beraber Windows Phone 7 içerisinde bulunacak olması. Özellikle HTML 5 desteği gelmesi ve hardware accelerationın sağlanacak olması Windows Phone 7 için büyük bir artı olacak. Internet Explorer 9 ‘da yapılan güzel çalışmalar Windows Phone 7’ye de taşınacak.
  • Bir diğer büyük yenilik ise Windows Phone 7 içerisinde SQL CE desteği gelecek olması. Bunun yanında Socket desteği, RAW kamera verisine erişim, native uygulamaların arka-planda çalışılabilirlik kazanması özellikleri oldukça ilgi çekiciydi.
  • Ayrıca özellikle Pivot kontrolünde ve List kontrollerinde performans geliştirmeleri.

Windows Phone 7 Mango güncellemesi sonbahara doğru kullanıcılara sunulmaya başlanacak.

Windows Phone 7 Developer Tools

Mango güncellemesi WP7 kullanıcılarına sunulurken tabi ki yazılım geliştiriciler için de Windows Phone 7 uygulama geliştirme araçlarında yakın zamanda bir güncellemeye gidiliyor olunacak. Çok yakın bir zaman sunulacak olan bu güncellemede Mango güncellemesinin yanında şu özellikler bulunacak.

  • Windows Phone 7 emulator üzerinde en büyük eksikliklerden biri de özellikle accelerometerın kullanıldığı senaryolarda emulator üzerinden hiçbir şekilde herhangi bir accelerometer verisi alamamaktaydık. Yeni gelecek güncelleme ile beraber emulator üzerine eklenecek bir yapı ile doğrudan accelerometer verisine kolay bir şekilde ulaşabileceğiz.
  • Emulator üzerindeki bir diğer büyük eksikliklerden biri de location verilerinin alınamamasıydı. Lokasyon bazlı olarak çalışan uygulamalar geliştirdiğimizde uygulamanın test edilmesi sırasında lokasyon verileri emulator üzerinden elde edilememekteydi. Yapılacak olan güncelleme ile emulator üzerinden harita üzerinde seçilen yerin bilgileri alınıp emulatore yollanabilecek ayrıca farklı noktaların koordinatları belirli aralıklarla emulator üzerine iletilebilecek. Örneğin kullanıcının lokasyonunun sürekli olarak değişeceği durumlarda uygulamanızın lokasyon bilgilerini nasıl işleyebildiğini görmek için bu özellik oldukça yararlı olacaktır.
  • Son olarak ise gelen en büyük yeniliklerden biri de Visual Studio üzerinde eklenen performans araçları. Uygulamanızın çalışması sırasında gerekli bilgileri toplayan bu performans araçları uygulama sonlandıktan sonra gerekli analizi gerçekleştirmekte ve uygulama içerisinde bulunan sorunların performans kayıplarının nerelerde hangi metotların çalışması sırasında gerçekleştiği çok kolay biçimde bulunabilmekte.

Kinect Windows SDK

Microsoft’un son dönemlerde çıkardığı en başarılı ürünlerden biri olan ve tüm zamanların en çok satan ürünlerinden biri olan Kinect’in Windows uygulamaları tarafından kullanılması için dışarıya sunulacak olan SDK’nın duyurusu da yapılmış oldu. C#, VB ve C++ ile kullanılabilecek olan bu SDK ile Kinect kullanılarak hızlı ve kolay bir şekilde uygulama geliştirmek mümkün hale gelecek. Kinect Windows SDK ile neler yapılabileceği ile ilgili örnekleri görmek için MIX Keynote sırasında yapılan demoları buradan izleyebilirsiniz.

Veee Silverlight 5 Beta !!!

Geçtiğimiz Aralık ayında Silverlight FireStarter etkinliğinde yapılan Silverlight 5 ile gelen yeniliklerin duyurulmasından sonra gözler MIX konferansına çevrilmişti. MIX konferansının ikinci günüde ScottGu beklendiği şekilde Silverlight 5 Beta’yı duyurdu ve developerların kullanımına sundu. Silverlight 5 ile gelen yeniliklerden bazıları da  şunlar.

  • 3D desteği.
  • XAML Custom Markup Extensions
  • XAML Debugging
  • Implicit Data Templates
  • Binding in Styles
  • Ancestor RelativeSource
  • Control Yenilikleri
  • Multi-Click Desteği
  • TrickPlay Desteği
  • OOB, Elevated Trust Yenilikleri

Silverlight FireStarter etkinliğinde duyurulan yeni özelliklerin hepsi Beta sürüm içerisinde bulunmamakta. Silverlight 5 Beta içerisinde bulunan özelliklere buradaki PDF dökümanından ulaşabilirsiniz. Ayrıca Silverlight Program Manager’ı Tim Heuer’ın blogundaki postundan da Silverlight 5 Beta yeniliklerini inceleyebilirsiniz. Bende en kısa zamanda Silverlight 5 Beta ile gelen yenilikleri sizlere aktarıyor olacağım.

Silverlight 5 ile beraber ayrıca Expression Blend’in Preview versiyonu da yayınlanmış durumda.

Silverlight 5 Beta Tools’u buradan indirebilirsiniz.

Expression Blend Preview ‘ı  da buradan indirebilirsiniz.

Ayrıca ilk günün keynote oturumunu da buradan ve ikinci gün oturumunu da buradan indirebilir veya izleyebilirsiniz.

Ayrıca MIX konferansı sırasında yapılan sunumlara da Channel 9 üzerinden erişebilirsiniz. Mutlaka diğer sunumları da izlemenizi tavsiye ederim.

Bir sonraki yazımızda görüşmek üzere,



C# 5.0 & VB.NET 11.0 Asenkron Programlama 5N1K (Ne,nerede,ne zaman,nasıl,neden,kim)

Merhaba Arkadaşlar, “İşte geldik yine bir C# & VB.NET V.Next yazımıza daha :) Sanki daha dün C# 4.0 ile beraber gelen dynamic özelliğini incelliyor gibiydik. Teknoloji durmadan gelişiyor. Neyse konumuza dönelim“

BUILD konferansıyla beraber  Windows 8 ile artık kullanıcı deneyimlerinin oldukça değiştiğini görmekteyiz. Eskiden kullandığımız kullanıcı arayüzleri ile şu anda kullandığımız kullanıcı arayüzleri aslında oldukça fark var :) Tabi bunda artık sayısı oldukça artan dokunmatik cihazların da payı bulunmakta. Değişen kullanıcı arayüzleriyle beraber geliştirilen uygulamaların yapısı ve davranışları da değişim göstermekte.

Eskiden yazdığımız uygulamalarda network yoğun veya I/O yoğun işlemleri gerçekleştirirken uygulamamızın arayüzü bir süreliğine kilitlenirken artık günümüzde kullandığımız altyapıların da nimetlerini kullanarak bu işlemleri genelde ayrı bir thread’e alarak bu yoğun işlemi UI thread’ten alıyoruz ve arayüzün kullanıcının hareketlerine  sürekli olarak cevap verebilmesini sağlayabiliyoruz. Yani işlemleri Asenkron olarak gerçekleştiriyoruz.

Kullanıcının deneyimini bu şekilde iyileştirirken şimdi bir de developer perspektifinden durumu inceleyelim :)

Developer Perspektifinden Asenkron Programlama

Şimdi gelin uygulama tarafında senkron ve asenkron kavramlarına WebClient tipi içerisinde bulunan DownloadString metodu ile göz atalım.

Senkron İşlem : WebClient tipi içerisinde bulunan DownloadString(…) metodunu çağırdığımızda senkron bir işlem gerçekleştirmekteyiz. DownloadString metodunun çalışma süresi boyunca uygulama metodun işlemini bitirmesi için beklemekte ve işlem bittikten sonra uygulama akışı devam etmektedir.

Asenkron İşlem : WebClient tipi içerisinde bulunan  DownloadStringAsync(…,Action<string> callback) metodu ise asenkron olarak çalışmakta. Metot çağırıldığı anda işlem başlatılmakta ve kontrol hemen metot çağırımı yapan kısma geri dönmekte ve böylece uygulama kaldığı yerden işlemlere devam edebilmektedir. Burada aklımıza gelen soru ise şu olmakta: “Peki işlemin tamamlandığını nasıl anlayabiliyoruz ? ” Bunun için de DownloadStringAsync metodu içerisine bir callback’i parametre olarak geçiriyoruz ve asenkron işlem tamamladığında uygulama doğrudan bu callback metoduna düşüyor ve bizlerde işlemin bittiğinden haberdar olabiliyoruz.

Eğer daha önce bu şekilde asenkron geliştirmelerde bulunduysanız callback kullanarak uygulama geliştirmek bazen acı çektirebiliyor bizlere. Lambda ifadeleriyle callback tanımlamak biraz daha kolay hale gelse de yaptığımız ayrı ayrı tanımlamalarla kodumuzu okunması ve anlaşılması zor bir hale getiriyoruz.

Yani Senkron programlama yaparken sahip olduğumuz rahatlığa asenkron programlama yaparken sahip olamıyor(duk)uz.

C# 5.0 & VB.NET 11.00 Ana Tema => Asenkron Programlama

Veee evet C# ve VB’nin gelecek versiyonlarının teması Asenkron programlama olarak belirlendi. Geçtiğimiz sene ilk olarak PDC’de duyurulan Asenkron programlama yapısı bu sene BUILD konferansında yapılan C# 5.0 ve VB.NET 11.0 duyurularıyla beraber artık adından daha da fazla söz ettirir oldu. :)

Yeni versiyonlarla beraber hayatımıza async ve await adında 2 adet yeni keyword giriyor olacak. Bu keywordler ile beraber asenkron işlemlerimizin orkestrasyonunu tıpkı senkron bir şekilde kod yazar gibi sağlayabiliyor olacağız. Geri kalan tüm işleri ise artık compiler tarafına bırakıyor olacağız. Compiler gerekli durumlarda yaptığımız bildirimlere göre arka planda kodumuzu değiştirerek gerekli eklemeleri yapıyor olacak.

Async & Await  Asenkron İşlemler Yapabilmek İçin Değil !!! Asenkron İşlemlerin Orkestrasyonu İçin Kullanılır.

Doğabilecek kafa karışıklıklarının önüne geçmek için yukarıdaki cümleyi iyi bir şekilde okumamızda fayda var. Çünkü metodunuzun başına async keywordünü koyarak o metodu asenkron yapamayacaksınız. :) Zaten elimizde bir işlemi asenkron bir şekilde çalıştırmak için .NET Framework 4.0 ile gelen bir Task tipi bulunmakta diyerek hiç kod paylaşımı yapmayacağım bu yazıda ufak tefek ipuçlarını da sizlerle paylaşıyorum :) .

NET Framework 4.0 ile beraber gelen en büyük yeniliklerden birinin de parallel programlama yenilikleri olduğunu düşünürsek compiler tarafında yapılan bu yeniliklerle özellikle artık uygulama geliştirme tarafında concurrent programlama kavramlarının daha da popüler olacağını söylemek herhalde yanlış olmayacaktır. Böylece hem birim zamanda daha fazla iş yaparak CPU’ları daha etkin bir şekilde kullanırken hem de uygulama arayüzlerinin cevap verebilir(responsive) olmasını sağlayabilir duruma geliyor olacağız.

Yazımı Build konferansında Anders Hejlsberg’in yaptığı sunumda kullandığı bir cümle ile bitiriyorum. :)

Bu kısa yazımızda C# ve VB’nin bir sonraki sürümüyle beraber gelecek ana yenilikleri hiç kod kısmına girmeden tamamen high-level olarak bu yazıda sizlere sunmayı hedefledim.

Umarım faydalı bir yazı olmuştur .

Sonraki yazılarımızda artık kod tarafına girerek Async özelliklerini incelemeye başlıyor olacağız. ;)

Hoşçakalın,



C# 5.0 & VB.NET 11.0 Async ve Await İle Kolaylaşan Asenkron İşlemler

Merhaba Arkadaşlar,

C# 5.0 & VB.NET 11.0 Asenkron Programlama 5N1K (Ne,nerede,ne zaman,nasıl,neden,kim)  isimli yazımızda sizlerle C# 5.0 ile beraber gelecek olan Asenkron Programlama yeniliklerini incelemeye çalışmıştık. O yazımızda dilsel yeniliklerden bahsetmek yerine daha çok konseptsel olarak Asenkron Programlama’nın ne olduğundan, neden gün geçtikçe daha da önem kazandığından ve hangi noktalarda bazı sorunlar yarattığından bahsetmiştik. Bu yazımızda ise artık teorik kısmı bir kenara bırakıp gelen yenilikleri kod üzerinden incelemeye çalışıyor olacağız.

Yazımız boyunca Netflix üzerinden girilen yıla göre çekilen filmleri getiren bir uygulama geliştiriyor olacağız. Uygulama içerisinde de Netflix’in sunmuş olduğu OData(Open Data Protocol) servisinden faydalanacağız.

İlk olarak uygulamamızı Netflix’ten filmleri senkron olarak getirecek şekilde geliştiriyor olacağız. Sonrasında aynı uygulamayı şu anda elimizde bulunan imkanlarla asenkron hale getireceğiz ve son olarakta aynı uygulamayı C# 5.0 ile beraber gelen async ve await keywordlerini kullanarak geliştirip, aralarındaki farkları incelemeye çalışacağız. O zaman hemen senkron olarak verileri getiren uygulamamızı geliştirmeye başlayalım !

Senkron Programlama

İlk olarak uygulamamızın arayüzünü tasarlayarak işe başlayalım. WPF tabanlı uygulamamız oldukça basit bir arayüze sahip olacak. Kullanıcıdan alacağımız yıla göre verileri getirme işlemine başlayacağız ve bir panel içerisine söz konusu filmler ile ilgili bilgileri dolduracağız. Bu nedenle hemen arayüz kısmını tasarlayalım ve sonrasında kodlama tarafına geçelim.

<Grid>   
<Label Content="Filmin Çekilme Senesi" Height="28" HorizontalAlignment="Left"
 Margin="6,12,0,0" VerticalAlignment="Top" />   
<TextBox Height="23" HorizontalAlignment="Left" Margin="136,14,0,0"
 Name="txtMovieYear" VerticalAlignment="Top" Width="120" />   
<Button Content="Ara" Height="23" HorizontalAlignment="Left"
 Margin="278,13,0,0" Name="btnSearch" VerticalAlignment="Top"
 Width="75" Click="btnSearch_Click" />    
<ScrollViewer VerticalScrollBarVisibility="Auto" Margin="0,46,0,0">         
<WrapPanel Name="resultsPanel" Orientation="Horizontal"/>    
</ScrollViewer>
 </Grid>

 

Evet yazımız boyunca uygulamamızın arayüzü yukarıda gördüğünüz gibi olacak. Bu nedenle artık yazımız boyunca arayüz kısmına hiç değinmeyeceğiz ;).

Şimdi gelelim uygulamanın arka plan kodlarına:)

Kod tarafını geliştirmeye başlamadan önce Netflix’in developerlara sunmuş olduğu OData servisi ile ilgili bir kaç detaya dikkat etmek gerekiyor. Bunlardan en önemlisi de servisin paging mantığıyla çalışması. Servis her çağrıda maksimum 20 film kaydı geri dönmekte. Bu yüzden servise yapılan çağrı sonucunda toplamda kaç film döneceğini belli olmadığından, servis herhangibir film dönmeyene kadar iterasyonu sürdürmemiz gerekiyor.

Şimdi ilk olarak uygulama boyunca kullanacağımız ve Netflix servisinden dönecek olan filmleri temsil edecek, Movie isimli sınıfı tasarlayalım ve sonrasında da yine servis çağrıları ve parsing işlemleri sırasında kullanacağımız web adreslerini ve isim alanlarını(namespace) tanımlayalım.

XNamespace xa = "http://www.w3.org/2005/Atom"
XNamespace xd = "http://schemas.microsoft.com/ado/2007/08/dataservices"
XNamespace xm = "http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"; 
string query = "http://odata.netflix.com/Catalog/Titles?$filter=ReleaseYear eq" 
               +"{0}&$skip={1}&$top={2}&$select=Url,BoxArt";
class Movie
{             
 public string Title { get; set; }             
 public string Url { get; set; }             
 public string BoxArtUrl { get; set; }         
}

Yukarıda görmüş olduğunuz namespace tanımlamalarını Netflix’ten dönen cevabın parse edilmesi ve çalışma zamanında Movies tipinden birer nesne örneği haline çevrilmesi sırasında kullanıyor olacağız. Query ismini verdiğimiz değişkenimiz ise istekte bulunacağımız adresi tutmakta.

Sıra geldi yıl girişi yapıldıktan sonra iş akışını yöneteceğimiz metodu yazmaya. Yazımızın başında Netflix’in bir çağrıda maksimum 20 film döndüğünden bahsetmiştik. Bu nedenle bizim arka planda bir paging yapısı kurarak arka arkaya Netflix tarafına isteklerde bulunmamız gerekmekte ta ki Netflix’ten yaptığımız çağrı sonucunda hiç film kaydı gelmeyene kadar.

void LoadMovies(int year)         
{             
 resultsPanel.Children.Clear();             
 var pageSize = 10;             
 var imageCount = 0;             
 while (true)             
 {                 
 var movies = QueryMovies(year, imageCount, pageSize);                 
 if (movies.Length == 0) break;                 
 DisplayMovies(movies);                 
 imageCount += movies.Length;             
 }         
}

Gördüğünüz gibi basit bir sonsuz döngü oluşturduk ve 10’arlı gruplar halinde film bilgilerini bize getirecek olan istekleri yarattık. Her isteğin yanıtını aldıktan sonra bir sonraki 10’arlı grubun isteğini yaratıp Netflix’e gönderdik. Netflix’ten film dönmediğinde ise artık filmlerin sonuna geldiğimiz anlayarak sonsuz döngüyü sonlandırdık.

LoadMovies metodu içerisinde 2 farklı metot çağrısı icra edildiği görülmektedir. Bunlardan biri Netflix’e istekte bulunan ve Movie dizisi döndüren QueryMovies metodu, diğeri ise dönen Movies dizisini ekranda image olarak gösteren DisplayMovies metodudur.Öncelikle DisplayMovies metodunun geliştirmesini yapalım.

void DisplayMovies(Movie[] movies)

{            

 foreach (var movie in movies)             
 {                 
 var bitmap = new BitmapImage(new Uri(movie.BoxArtUrl));                 
 var image = new Image();                 
 image.Source = bitmap;                 
 image.Width = 110;                 
 image.Height = 150;                 
 image.Margin = new Thickness(5);                 
 var tt = new ToolTip();                 
 tt.Content = movie.Title;                 
 image.ToolTip = tt;                 
 var url = movie.Url;                 
 image.MouseDown += (sender, e) => System.Diagnostics.Process.Start(url);                 
 resultsPanel.Children.Add(image);             
 }         

Metot içerisinde gelen her bir Movie nesne örneği için bir BitmapImage yaratılmakta ve daha sonra arayüzdeki panel içerisine yaratılan Image’lar teker teker eklenmektedir. Netflix’e istekte bulunan QueryMovies metodu ise şu şekilde olacaktır.

Movie[] QueryMovies(int year, int first, int count)         
{             
 var client = new WebClient();             
 var url = String.Format(query, year, first, count);             
 var data = client.DownloadString(new Uri(url));             

 var movies =from entry in XDocument.Parse(data).Descendants(xa + "entry")                 
 let properties = entry.Element(xm + "properties")                 
 select new Movie                 
 {                     
 Title = (string)entry.Element(xa + "title"),
                  Url = (string)properties.Element(xd + "Url"),
 BoxArtUrl = (string)properties.Element(xd + "BoxArt").Element(xd + "LargeUrl")                 
 };
              return movies.ToArray();         

Yazımız boyunca en çok değineceğimiz metodumuz QueryMovies metodu olacaktır. Çünkü senkron veya asenkron geliştirmenin başlayacağı nokta bu metoddur. Biz ilk olarak senkron bir şekilde çalışacak uygulama geliştireceğimiz için, WebClient tipi içerisinde bulunan DownloadString metodunu kullandık. Bu metot senkron olarak ilgili adrese gitmekte ve o anda istekte bulunan threadi bekletmektedir. Bu nedenle uygulamayı tamamlayıp çalıştırdığımızda göreceksiniz ki filmlerin yüklenmesi hem uzun sürecek hem de bu sırada uygulamanız responsive(cevap verebilir) olmayacaktır.

Şimdi son olarak search butonumuz için Click olay metodunu da (event handler’ını da) yazalım ve uygulamamızı çalıştıralım.

private void btnSearch_Click(object sender, RoutedEventArgs e)         
{             
 LoadMovies(Int32.Parse(txtMovieYear.Text));         
} 

Uygulamayı çalıştırdığınızda istediğiniz bir yılı girip arama yapmaya çalıştığınızda Ara butonuna basar basmaz uygulamanızın kilitlendiğini göreceksiniz. Tabi network bağlantınıza göre uygulamanın yaklaşık olarak 1 ile 2 dakika arasında cevap veremez durumda olması hiçte istenilen bir durum değildir !  Hele ki artık uygulamaların tabletlere taşınmasıyla beraber bu gibi durumlar kullanıcı deneyimi açısından bakıldığında oldukça kötü deneyimler doğurmaktadır.

Özellikle uygulamalarınızda yukarıdaki örneğimizdeki gibi network üzerinden çağrılar yapıyorsanız veya I/O işlemleri gibi uzun sürebilecek işlemler gerçekleştiriyorsanız yapmanız gereken bu işlemleri asenkron bir biçimde gerçekleştirmektir. Böylece çalışan ana threadi kilitlemeyerek işlemleri bir arka thread’e alacağız.

Şimdi gelin aynı uygulamayı asenkron bir biçimde çalışacak şekilde değiştirelim. Bu değiştirme sırasında C# 5.0 ile gelen asenkron programlama yeniliklerini değil elimizde mevcut olarak bulunan asenkron yapılarını kullanacağız. Böylece C# 5.0 ile beraber gelen yeniliklerin kıymetini daha da iyi anlayacağız. ;)

C# 5.0 Öncesi Asenkron Programlama

.NET Framework içerisindeki kütüphanelere baktığımızda, bazıları içerisinde işlemlerin asenkron olarak yapılmasını sağlayan metotlar bulunduğunu görürüz. Bu fonksiyonlar Async son eki ile bitmektedir. Hatta web servis referansı eklediğinizde, eğer asenkron metotların da eklenmesini seçerseniz adları Async ile biten ve asenkron olarak çalışan metotları görebilirsiniz.

Şu anda framework içerisinde bulunan asenkron metotların çalışması ise callback mantığına dayanmaktadır. İlgili metodu çağırmadan önce metodun çalışmasının sonlanmasından sonra çalışacak olan bir callback tanımlıyorsunuz. Daha sonrasında ise metot arka planda işlemlerini sürdürürken ana threadiniz kilitlenmiyor ve uygulamanız tepki verebilir durumda kalıyor. Metot çalışması sonlandıktan sonra da callback fonksiyonu çalışarak ilgili işlemlerinizi yapabiliyorsunuz.

Bizim yukarıda çağırmış olduğumuz DownloadString metodunun da .NET Framework içerisinde asenkron olarak çalışan DownloadStringAsync isimli versiyonu bulunmaktadır. Şimdi gelin QueryMovies isimli metodumuzu bu noktadan başlayarak değiştirelim.

void QueryMoviesAsync(int year, int first, int count, 
 Action<Movie[], Exception> processMovies)         
{             
 var client = new WebClient();             
 var url = String.Format(query, year, first, count);             
 client.DownloadStringCompleted += (sender, e) =>             
 {                 
 if (e.Error != null)                 
 {                     
 processMovies(null, e.Error);                     
 return;                 
 }                 
 var data = e.Result;                 

 var movies = from entry in XDocument.Parse(data).Descendants(xa + "entry")                     
 let properties = entry.Element(xm + "properties")                     
 select new Movie                     
 {                         
 Title = (string)entry.Element(xa + "title"),                         
Url = (string)properties.Element(xd + "Url"),                         
 BoxArtUrl = (string)properties.Element(xd + "BoxArt").Element(xd + "LargeUrl")                     
 };                 
 processMovies(movies.ToArray(), null);             
 };             

 try             
 {                 
 client.DownloadStringAsync(new Uri(url));             
 }             
 catch (Exception ex)             
 {                 
 processMovies(null, ex);             
 }         
}

Gördüğünüz gibi öncelikle DownloadStringCompleted isimli DownloadStringAsync isimli metodun çalışmasının sonlanmasının ardından çağrılacak olan callback tanımını yaptık. Sonrasında ise DownloadStringAsync isimli metodu çağırdık.

Metotta yaptığımız değişikliklerden birisi de parametre olarak aldığımız processMovies isimli Action tipi. Bu Action delegate’i içerisinde ise Netflix servisine yapacağımız çağrıları tutuyor olacağız. Böylece her callback içerisinde ilgili çağrım kontrolleri yapılıyor olacak. QueryMoviesAsync metodunu çağırdığımız ve action tipindeki delegate’I parametre olarak geçirdiğimiz LoadMoviesAsync metodu ise şu şekilde olacaktır.

void LoadMoviesAsync(int year)         
{             
 resultsPanel.Children.Clear();             
 var pageSize = 10;             
 var imageCount = 0;             
 Action<Movie[], Exception> action = null;             
 action = (movies, ex) =>             
 {                 
 if (ex != null)                 
 {                     
 throw ex;                 
 }                 
 if (movies.Length > 0)                 
 {                     
 DisplayMovies(movies);                     
 imageCount += movies.Length;                     
 QueryMoviesAsync(year, imageCount, pageSize, action);                 
 }             
 };             
 QueryMoviesAsync(year, imageCount, pageSize, action);         
}

Şimdi uygulamayı çalıştırdığımızda ilk farkedeceğimiz değişiklik artık yılı girip ara butonuna bastığımızda uygulamanın kilitlenmeyeceğidir. Ayrıca uygulama asenkron olarak çalışacağından her 10’arlı grup çağrısında dönen filmler ekranda görünüyor olacaktır. Aslında baktığımızda yazımızın başında bahsettiğimiz kullanıcı deneyimi konusunda oldukça iyi bir ilerleme kaydettik.

Şimdi developer açısından baktığımızda, bakarsak senkron olarak yazdığımız kodu neredeyse tamamen değiştirdiğimizi görebiliriz. Bunun yanında yaptığımız callback tanımlamaları da metodumuzu oldukça uzattı. Eğer Netflix servisi filmlerin  fotoğraflarını, detaylarını ve film listesini ayrı bir adresten sunsaydı, yazacağımız metot taslak olarak şu şekilde olacaktı.

WebClient filmClient = new WebClient();             
filmClient.DownloadStringCompleted += (sender, e) =>                 
{                     
 WebClient imageClient = new WebClient();                     
 imageClient.DownloadStringCompleted += (_sender, _e) =>                         
 {                             
 WebClient detailClient = new WebClient();                             
 detailClient.DownloadStringCompleted += (__sender, __e) =>                                 
 {                                 
 };                             
 detailClient.DownloadStringAsync(new Uri("Detail Getirme URI'si"));                         
 };                     
 imageClient.DownloadStringAsync(new Uri("Image Getirme URI'si"));                 
};
             
filmClient.DownloadStringAsync(new Uri("Film Listesi Getirme URI'si"));

Gördüğünüz gibi asenkron çağrılarımız arttıkça callback’lerimizin de sayısı artmaktadır. Bu durum da metot içeriklerinin oldukça büyümesine ve metotlar üzerinde kontrolü kaybetmemize sebep olarak bakımı oldukça zorlaştırmaktadır.

Ayrıca bir uygulamadaki bazı kısımları asenkron çalıştırmak için neredeyse tüm kodu değiştirdik. Daha da önemli olan uygulama geliştirme mentalitemizi değiştirdik. Açıkcası asenkron uygulama geliştirirken Dekleratif Programlama(bir işi yaparken nasıl yapacağından çok ne yapacağına odaklanmak)’dan oldukça uzaktaydık. Bu noktada sanırım asenkron kod yazmak bu kadar zor olmamalıydı dediğinizi duyar gibiyim :) Öyleyse gelin artık C# 5.0 tarafına geçelim ;)

C# 5.0 ile Asenkron Programlama

C# 5.0’ın teması önceki yazımızda da bahsettiğimiz gibi asenkron programlama. Bu sürümle beraber asenkron işlemlerin orkestrasyonunun artık compiler tarafına bırakılması amaçlanmakta. Böylece de artık senkron ile asenkron programlama arasındaki development farkının minimuma indirilmesi hedeflenmekte. Peki nasıl mı ?

C# 5.0 ile beraber artık hayatımıza async ve await isminde iki keyword giriyor olacak. Bu keywordlerden ilki olan async, asenkron çağrı yapılan metotların işaretlenmesi amacıyla kullanılmaktadır. Eğer bir metodunuz içerisinde asenkron bir çağrıda bulunuyorsanız ve bu çağrıdan dönen sonucun uygulama tarafına dönme işlemlerini compiler tarafına bırakmak istiyorsanız o metodun başına async keywordünü koymanız gerekmektedir. Böylece compiler async keywordünü gördüğü metotlarda asenkron çağrı yapıldığını algılayıp, çağrı yapılan yerlerde gerekli yapıları ve işleri kendisi arka planda yaratmaktacak ve yürütmektecektir.

Await keyword’ünü ise asenkron işlemleri çağırma sırasında kullanmaktayız. Asenkron çağrının yapıldığı kısımda await kullanarak bu ifadenin devamında bulunan kod bloğunun asenkron işlemin sonucunda işletilecek bölüm olduğunu compilera belirtmekteyiz.

Şimdi yavaş yavaş C# 5.0 ’a giriş yapalım. İlk olarak yapmamız gereken şu anda CTP3 sürümünde olan Visual Studio Async’i kurmak. Buradaki adresten ilgili setup dosyasını indirip kurulumu yapmanız gerekmekte. Kurulumu yaptıktan sonra çeşitli platformlardaki uygulamalarınızda kullanmanız için gelen farklı kütüphaneleri Documents\Microsoft Visual Studio Async CTP\Samples klasörü içerisinde bulacaksınız. Biz .NET uygulamalarında kullanacağımız AsyncCtpLibrary.dll’ini projemize öncelikle referans olarak ekliyor olacağız.

İlk olarak değişikliğimize WebClient tipi içerisinde bulunan DownloadStringAsync metodu ile başlayacağız. Yukarıda bahsetmiş olduğum kütüphaneyi proje referans olarak eklediyseniz WebClient tipi içerisine Task<string> tipini döndüren DownloadStringTaskAsync isimli metodun extension metot olarak eklendiğini görebilirsiniz. Peki bu metodun anlamı ne ?

Task tipi bildiğimiz gibi .NET 4.0 ile beraber paralel programlama yenilikleri kapsamında  .NET Framework içerisine eklendi. En basit anlamda söylememiz gerekirse Task tipi devam etmekte olan asenkron bir işlemi temsil etmektedir. Bu nedenle aslında baktığımızda Task tipi asenkron operasyonların yönetimi esnasında kullanılacak en öncelikli tiptir. İşte bu sebepten dolayı await ifadesi Task tipi veya void dönüş tipine sahip işlemler ile kullanılabilmekte yani compiler Task,Task<T> veya void dönüş değerine sahip asenkron işlemlerin yönetimini yapabilmektedir.

async Task<Movie[]> QueryMoviesAsync(int year, int first, int count)         
{             
 var client = new WebClient();             
 var url = String.Format(query, year, first, count);             
 var data = await client.DownloadStringTaskAsync(new Uri(url));             
 var movies =from entry in XDocument.Parse(data).Descendants(xa + "entry")                 
 let properties = entry.Element(xm + "properties")                 
 select new Movie                 
 {                     
 Title = (string)entry.Element(xa + "title"),                     
 Url = (string)properties.Element(xd + "Url"),                     
 BoxArtUrl = (string)properties.Element(xd + "BoxArt").Element(xd + "LargeUrl")                 
 };             
 return movies.ToArray();         

Yukarıda QueryMovies metodumuzun C# 5.0 ‘a göre güncellenmiş halini görmekteyiz. İlk olarak yukarıda bahsettiğimiz gibi WebClient tipinin DownloadStringTaskAsync metodunu kullandık. Daha sonra bu metodu çağırmadan önce await keywordünü kullanarak bu metot çağrımından sonra bulunan ifadelerin artık callback içerisinde bulunmasını ve asenkron işlem tamamlandıktan sonra işletilmesi gerektiğini compilera belirttik.

Daha sonra ise metodumuz içerisinde asenkron bir çağrımda bulunduğumuzdan dolayı QueryMovies isimli metodun başına async modifier’ını koyduk. Böylece compilera bu metot içerisinde asenkron bir çağrım olduğunu ve await ifadesi gördüğü kısımlarda gerekli işlemleri yapmasını bildirdik.

Son olarak ise metodumuzun dönüş tipini Task<Movies[]> şeklinde değiştirdik. Böylece LoadMovies metodu içerisinden asenkron olarak bu metodun çağrımını gerçekleştirebileceğiz. Metodumuzun ismininde QueryMoviesAsync olarak değiştiğini farketmişsinizdir. Bunun nedeni ise isimlendirme kurallarına uygun bir şekilde geliştirme yapmamızdır. Asenkron olarak çalışan metotların isimlerinin sonuna Async koyarak bu metotları kullanan diğer developerların da metodun asenkron olarak çalıştığını anlaması kolaylaşacaktır.

Şimdi gelelim LoadMovies isimli metodumuza. Aslında bu metodumuz üzerinde de hemen hemen yukarıda yapmış olduğumuz değişiklikleri yapıyor olacağız.

async void LoadMoviesAsync(int year)         
{             
 resultsPanel.Children.Clear();             
 var pageSize = 10;             
 var imageCount = 0;             
 while (true)             
 {                 
 var movies = await QueryMoviesAsync(year, imageCount, pageSize);                 
 if (movies.Length == 0) break;                 
 DisplayMovies(movies);                 
 imageCount += movies.Length;             
 }         

Yukarıda gördüğünüz gibi kodumuz aslında neredeyse senkron kod ile aynı. Sadece metodumuzun başına async modifierını koyduk ve metot içerisinde bir asenkron metot çağrımı olacağını compiler’a bildirdik. Daha sonra ise biraz önce yazmış olduğumuz QueryMoviesAsync metodunu çağrımından önce await kullanarak metot çağrımından sonra gelen ifadelerin artık metot işletiminden sonra işletilmesi gerektiğini compilera bildirdik. Bir de tabi ki yine asenkron çalışan bir metot geliştirdiğimiz için metodumuzun ismini LoadMoviesAsync olarak değiştirdik.

Async & Await ile Kolaylaşan Asenkron İşlemler

Evet arkadaşlar gördüğünüz gibi C# 5.0 ile beraber gelen async ve await modifierları ile artık senkron veya asenkron çalışan kodlar arasında çokta fazla fark kalmıyor. Hemen hemen 2-3 değişiklik ile senkron olarak çalışan kodumuzu asenkron olarak çalışacak duruma getirebiliyoruz. Aşağıdaki görsellerde şimdiye kadar yazmış olduğumuz senkron, asenkron ve C# 5.0 asenkron kodlarını ve aralarındaki farklılıkları görebilirsiniz.

C# 5.0’ın temasının asenkron programlamayı senkron programalama kadar basit yapmak olduğunu yeniden hatırlarsak bunu başarıyla gerçekleştirdiğiniz sanırım yukarıdaki tablodan çıkarabiliriz.

Asenkron programlama yeniliklerini özetlememiz gerekirse;

Temel olarak C# 5.0 ile dile async ve await keywordleri gelmektedir. Bu keywordlerden async bir metot modifier olarak kullanılırken yazmış olduğunuz  metot içerisinde asenkron bir işlem yapıldığını compilera bildirmekte. async modifier’ına sahip olan metotların dönüş tiplerinin void,Task veya Task<T> tiplerinden birinin olması gerektiğini aklımızda bulundurmamızda yarar var.

Await ifadesi ise asenkron yürütülecek olan bir işlemin compilera bildirilmesinde ve bu ifadenin altında bulunan ifadelerin asenkron işlemin sonucunda işletileceğini compilera bildirmekte. Böylece compiler arka planda kurduğu callback yapısına bizim kodlarımızı dahil etmekte.

Bu noktaya kadar farkettiyseniz .NET 4.5 ile beraber gelecek olan hiçbir tipten bahsetmedik. Bunun nedeni ise C# 5.0’ın tamamen .NET Framework içerisinde bulunan mevcut tipleri kullanarak tüm iş yükünü üzerine alması. Belki de bu gelen yeni özelliğin bir dil özelliği olduğunu en iyi açıklayan argümanımız bu ;)

C# 5.0 ile gördüğünüz gibi yine oldukça güzel özellikler gelmekte. Async özelliğinin yukarıda bahsetmiş olduğumuz kullanımı dışında daha farklı kullanımlarını da ilerleyen yazılarımızda inceliyor olacağız. Bir sonraki yazımızda görüşmek üzere, C# ile kalın… Not 1: Uygulama Visual Studio Async CTP3 ile geliştirilmiştir. Yazımız boyunca yazdığımız C# kodlarını aşağıdan indirebilirsiniz. AsyncStuff