C# Windows Phone 8 WP8 開發,將WebClient的DownloadStringCompleted事件改成非同步的awiat方法。

  • 3112
  • 0
  • C#
  • 2015-06-10

一般我們在傳謝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

 

文章中的敘述如有觀念不正確錯誤的部分,歡迎告知指正 謝謝
轉載請註明出處,並且附上本篇文章網址 !  感謝。

SUKI

HOLIESTAR