2012-11-01 22 views
5

支持WP8中的異步/等待模式?Windows Phone網絡訪問API中的異步等待

我需要從基於Web的API獲取XML,看起來WebClientWebRequest不支持它。

在WP8 BCL中是否有支持異步/等待可用於Web訪問的類?如果沒有,是否有我可以使用的圖書館?

我知道創建包裝來支持它並不難,但這看起來像是一個包含在SDK中的東西。

回答

16

在WP8 BCL中,是否有支持異步/等待可用於Web訪問的類?

這是在WP8 SDK內測期間引起的一個問題,所以我可以回答這個問題,不幸的是,沒有。

但正如你所提到的,製作自己的包裝是相當容易的。

例如:

public static class Extensions 
{ 
    public static Task<string> DownloadStringTask(this WebClient webClient, Uri uri) 
    { 
     var tcs = new TaskCompletionSource<string>(); 

     webClient.DownloadStringCompleted += (s, e) => 
     { 
      if (e.Error != null) 
      { 
       tcs.SetException(e.Error); 
      } 
      else 
      { 
       tcs.SetResult(e.Result); 
      } 
     }; 

     webClient.DownloadStringAsync(uri); 

     return tcs.Task; 
    } 
} 
+0

爲什麼你會把異步操作在自己的線程?我不知道爲什麼,但這看起來很可怕! –

+0

只需刪除Task.Factory.StartNew ... –

+1

@ToniPetrina你是對的,謝謝。固定。 –

0

是否有在WP8異步/ AWAIT模式支持?

只是爲了澄清,沒有在Windows Phone 8完整的C#5.0的支持WinRT的API的主要依賴於異步/ AWAIT,如同步到PeopleHub,或使用I/O的API。

但是Silverlight和舊的.NET API沒有被更新爲像WebClient這樣的類使用async/await。

+0

我知道有語言支持,但KooKiz斷言,沒有API支持。 –

+0

如果您閱讀了我的*整個*文章,您會看到*有* API支持,用於* some * API。 –

1

我有同樣的問題,我發現這一點,並幫我

private async Task<T> ExecuteAsync<T>(RestRequest request) 
    { 
     var tcs = new TaskCompletionSource<T>(); 
     _client.ExecuteAsync(request, resp => 
     { 
      var value = JsonConvert.DeserializeObject<T>(resp.Content); 
      if (value.ErrorCode > 0) 
      { 
       var ex = new ToodledoException(value.ErrorCode, value.ErrorDesc); 
       tcs.SetException(ex); 
      } 
      else 
       tcs.SetResult(value); 
     }); 
     return await tcs.Task; 
    } 

http://www.developer.nokia.com/Community/Wiki/Asynchronous_Programming_For_Windows_Phone_8 還我發現這個擴展有用http://nuget.org/packages/WP8AsyncWebClient/