【问题标题】:Async await in Windows Phone web access APIsWindows Phone Web 访问 API 中的异步等待
【发布时间】:2012-10-21 20:03:59
【问题描述】:

WP8 中是否支持 async/await 模式?

我需要从基于 Web 的 API 获取 XML,而 WebClientWebRequest 似乎不支持它。

在 WP8 BCL 中是否有支持 async/await 的类可用于 Web 访问?如果没有,有没有我可以使用的库?

我知道创建包装器来支持它并不难,但这似乎会包含在 SDK 中。

【问题讨论】:

    标签: c# async-await windows-phone-8


    【解决方案1】:

    WP8 BCL 中是否有支持 async/await 的类可用于 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;
        }
    }
    

    【讨论】:

    • 为什么要将异步操作放在自己的线程中?我不知道为什么,但这看起来很可怕!
    【解决方案2】:

    作为Microsoft.Bcl.Async NuGet package 的一部分提供的Microsoft.Threading.Tasks.Extensions.Phone.dll 中有一些对WP8 的支持,描述了in this blog post

    特别是,它包括WebClient.DownloadStringTaskAsync

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题,我发现了这个并帮助了我

      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/

      【讨论】:

        【解决方案4】:

        WP8 中是否支持 async/await 模式?

        澄清一下,Windows Phone 8 完全支持 C# 5.0。WinRT API 很大程度上依赖于 async/await,例如同步到 PeopleHub 或使用 I/O API。

        但 Silverlight 和旧的 .NET API 尚未更新为对 WebClient 等类使用 async/await。

        【讨论】:

        • 我知道有语言支持,但 KooKiz 断言,没有 API 支持。
        • 如果您阅读了我的整个 帖子,您会发现 API 支持一些 API。
        【解决方案5】:

        WP8 具有原生 async/await 支持,但存在一些限制,例如缺少 HttpClient 和可能的其他类。
        WP7 在 VS2010 中使用 AsyncCTP 支持 async/await,但在 VS2012 中它最近被重新添加为 Microsoft.Bcl.Async:
        https://nuget.org/packages/Microsoft.Bcl.Async/1.0.12-beta

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-06-28
          • 2021-09-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多