C# Windows Phone 8 WP8 开发,将WebClient的DownloadStringCompleted事件改成非同步的awiat方法。

原文: C# Windows Phone 8 WP8 开发,将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


DotBlogs Tags: C# DownloadStringCompleted DownloadStringTask Visual Studio 2013 WebClient Windows Phone 8

关连文章

C# Windows 8 & 8.1 开发,启用NavigationCacheMode,以防Navigate导览至其他页面时的资料遗失。

[笔记]C# Windows Phone 8 WP8 开发,找回StackPanel底下Orientation消失的属性。

[笔记] C# Windows Phone 8 WP8 开发,判断目前网路是否可用。

C# Windows 8、Phone 8 开发,取得控制项中的ItemTemplate内控制项事件的Binding Object。

你可能感兴趣的:(windows phone)