Windows Phone 8 ile WebClient sınıfında async kullanımı

İ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"));


blog comments powered by Disqus

Engin Polat hakkında

Chief Architect, Microsoft RD, Microsoft MVP

Ada ve Ege'nin babası ;)

Kategoriler

İstatistik

Makale Adedi: 452

Creative Commons Lisansı