İnternet üzerinden veri indirmeden Windows Phone 8 ile uygulama geliştirmek genellikle pek beklenmez.
async ve await anahtar kelimeleri hayatımıza girdikten sonra internetten veri indirmek gibi uzun sürebilecek işleri asenkron yapmaya başladık.
Fakat WebRequest ve WebClient sınıflarında async/await pattern‘inin eksikleri hissediliyor.
Örneğin WebClient sınıfının DownloadStringAsync method’unu inceleyelim;
public void DownloadStringAsync(Uri address);</pre>
Gördüğümüz gibi, geriye Task veya Task<T> tipinde sonuç döndürmüyor.
Bu yüzden bu method’u await anahtar kelimesi ile kullanamıyoruz;
WebClient wc = new WebClient(); await wc.DownloadStringAsync(new Uri("http://www.enginpolat.com"));
Daha derleme esnasında
// Cannot await "void"
hatası alırız.
Fakat aşağıdaki sınıfı ve extension method’u kullanarak WebClient sınıfına Task<T> sonuç döndüren method ekleyebiliriz;
public static class Extensions { public static Task<string> DownloadStringTask(this WebClient client, Uri uri) { var tcs = new TaskCompletionSource<string>(); client.DownloadStringCompleted += (s, e) => { if (e.Error != null) { tcs.SetException(e.Error); } else { tcs.SetResult(e.Result); } }; client.DownloadStringAsync(uri); return tcs.Task; } }
Örnek kullanım;
WebClient wc = new WebClient(); return await wc.DownloadStringTask(new Uri("http://www.enginpolat.com"));
Senior Software Engineer, @Microsoft
Ada ve Ege'nin babası ;)
Makale Adedi: 484