İ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