Permalink
Switch branches/tags
Nothing to show
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
67 lines (45 sloc) 2.78 KB
layout title date author comments category tags
post
Windows Phone 8 ile WebClient sınıfında async kullanımı
2012-12-13 10:56
engin.polat
true
Programlama
async
await
class
downloadstringasync
downloadstringcompleted
extensionmethod
İnternet
pattern
public
return
setexception
setresult
static
string
task
taskcompletionsource
void
webclient
webrequest
windows phone
wp8

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

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