5

WP8 中是否支持异步/等待模式?

我需要从基于 Web 的 API 获取 XML,它看起来像这样WebClientWebRequest不支持它。

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

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

4

5 回答 5

16

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;
    }
}
于 2012-11-01T09:34:26.233 回答
8

作为本博文中描述的NuGet 包Microsoft.Threading.Tasks.Extensions.Phone.dll的一部分,提供了一些对 WP8 的支持。Microsoft.Bcl.Async

特别是,它包括WebClient.DownloadStringTaskAsync.

于 2012-11-01T20:17:42.907 回答
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/

于 2013-06-18T09:20:59.037 回答
0

WP8 中是否支持异步/等待模式?

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

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

于 2012-11-01T09:58:48.330 回答
0

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

于 2012-11-01T21:31:32.770 回答