Taskcompletionsource | Engin Polat\'ın Windows 8 , Windows Phone 8 ve C# içerikli programcılık sitesi

Arşiv

Etiketlenen yazılar taskcompletionsource

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

13 December 2012 Yorum yapılmamış

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