一般我們在傳謝Windows Phone APP 的時候,很常使用WebClient來幫我們完成抓取網路資料的動作,並且利用DownloadStringCompleted的事件去幫我們得知載入的事件已經完成了,可以讓我們進行下一步的動作,但是若我們想要將WebClient的DownloadStringCompleted事件改成非同步的awiat方法該如何做呢?!可以自訂一延伸WebClient的方法來達成。
本篇文章將引導您將WebClient的DownloadStringCompleted事件改成非同步的awiat方法。
一般我們在撰寫Windows Phone APP 的時候,很常使用WebClient來幫我們完成抓取網路資料的動作,並且利用DownloadStringCompleted的事件去幫我們得知載入的事件已經完成了,可以讓我們進行下一步的動作,但是若我們想要將WebClient的DownloadStringCompleted事件改成非同步的awiat方法該如何做呢?!可以自訂一延伸WebClient的方法來達成。
本篇文章將引導您將WebClient的DownloadStringCompleted事件改成非同步的awiat方法。
首先這是Windows Store App上開發時會使用的程式碼,功能是從網路擷取網頁原始資料:
1: //網路動作
2: public async Task<string> Download_WebFrom(string url)
3: {
4: HttpClient http = new System.Net.Http.HttpClient();
5: HttpResponseMessage response = await http.GetAsync(url);
6: return await response.Content.ReadAsStringAsync();
7: }
然後成功之後很開心地移植到Windows Phone 8上使用,結果悲劇發的奇怪不能用.....
後來改回用原本的WebClient的DownloadStringCompleted事件來達成,功能一樣是從網路擷取網頁原始資料,可是就跟原本的寫法不一樣:
1: private void DownloadFromWeb()
2: {
3:
4: WebClient wc = new WebClient();
5: wc.Encoding = Encoding.UTF8;
6: wc.DownloadStringAsync(new Uri(Albums_URL));
7: wc.DownloadStringCompleted += wc_DownloadStringCompleted;
8: }
9:
10: void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
11: {
12: //Debug.WriteLine("wc_DownloadStringCompleted" + e.Result);
13: try
14: {
15: string data = e.Result;
16: }
17: catch(Exception ex)
18: {
19: //網路GG
20: MessageBox.Show(ex.Message);
21: }
22: }
這樣會造成移植上的困擾還要改一堆其他程式碼實在不方便,
所以索性用延伸WebClient方法的方式來改造一下程式碼。
步驟一:
開一個新的類別檔(class),類別的型別是靜態的,並命名為Extensions如下程式碼所示:
1: public static class Extensions
2: {
3: public static Task<string> DownloadStringTask(this WebClient webClient, Uri uri)
4: {
5: var tcs = new TaskCompletionSource<string>();
6:
7: webClient.DownloadStringCompleted += (s, e) =>
8: {
9: if (e.Error != null)
10: {
11: tcs.SetException(e.Error);
12: }
13: else
14: {
15: tcs.SetResult(e.Result);
16: }
17: };
18:
19: webClient.DownloadStringAsync(uri);
20:
21: return tcs.Task;
22: }
23: }
上述程式碼是將WebClient底下新增一個自定義的方法,那也是使用DownloadStringCompleted的方式來回傳直。
而自訂義的方法名稱為DownloadStringTask。
步驟二:
如此一來我們就可以在主程式中使用WebClient底下DownloadStringTask的方法囉!!
1: public async Task<string> Download_WebFrom(string url)
2: {
3: WebClient client = new WebClient();
4: string data = await client.DownloadStringTask(new Uri(url));
5: return data;
6:
7: }
這樣我們就將將WebClient的DownloadStringCompleted事件改成非同步的awiat方法囉!!
Refrence : Async await in Windows Phone web access APIs
文章中的敘述如有觀念不正確錯誤的部分,歡迎告知指正 謝謝
轉載請註明出處,並且附上本篇文章網址 ! 感謝。