Merhaba Arkadaşlar,
Yazı yazmayalı uzun zaman oldu. Microsoft Yaz Okulu 2013 projemi geliştirirken .NET 5.0’ın nimetleri ile birlikte gelen async ve await komutları hakkında öncelikle bilgi vermek istiyorum. async ile fonksiyonumuzun declare kısmına yerleştirdiğimiz keyword ile fonksiyonumuzun asenkron olduğunu işaretlemekteyiz.Ayrıca await komutunu her çağırdığımız asenkron fonksiyonun başına ekleyerek ise yapılan asenkron işlemin döndürdüğü değer eşitlenen referansa yüklenene kadar o işlemde beklemesini sağlamaktayız.
Böylelikle referansımızın null olma sorununu kolayca çözmüş bulunuyoruz.WCF kullanılmış ise malesef ki Task, await, async işlemlerini düzgün bir şekilde kullanamıyoruz. Uzun uğraşlarım sonucu sorunun çözümünün TaskCompletionSource olduğunu anladım.Bu sorun şimdilik Windows Phone 8’de yaşanmakta. İleriki versiyonlarda bu desteğin geleceğini düşünüyorum. Şimdi sorunun nasıl çözüldüğüne gelelim.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
public static async Task<byte[]> GetImageTask(string ImageName) { var tcs = new TaskCompletionSource<byte[]>(); DataOp.ResimSQLClient client = new DataOp.ResimSQLClient("BasicHttpBinding_IResimSQL", "http://sehmustest.azurewebsites.net/ResimSQL.svc"); client.getImageFromCloudCompleted += (s, e) => { if (e.Error != null) { tcs.TrySetException(e.Error); } else if (e.Cancelled) { tcs.TrySetCanceled(); } else { tcs.TrySetResult(e.Result as byte[]); } }; client.getImageFromCloudAsync(ImageName); return await tcs.Task; } |
Açıklama kısmına gelecek olursak,
TaskCompletionSource ile fonksiyondan geriye task döndürmüş oluyoruz ve async await desteğini WCF için Phone’umuza sağlamış oluyoruz. Olası hata durumlarında TaskCompletionSource’umuzu dolduruyoruz ve İşlemler bu kadar. Şimdi nasıl çağırdığımıza bir göz atalım.
1 |
byte[] imageTask = await GetImageTask(currentImage.Tag.ToString()); |
Hepsi bu kadar 🙂
Umarım kolay olmuştur. İyi Çalışmalar Dilerim 🙂