异步等待Windows Phone Web访问API

时间:2012-11-01 08:42:20

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

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

我需要从基于网络的API获取XML,看起来WebClientWebRequest不支持它。

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

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

5 个答案:

答案 0 :(得分:16)

  

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

答案 1 :(得分:8)

Microsoft.Threading.Tasks.Extensions.Phone.dll中对{8}} Microsoft.Bcl.Async NuGet package所提供的WebClient.DownloadStringTaskAsync提供了一些支持。

特别是,它包含{{1}}。

答案 2 :(得分: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/

答案 3 :(得分:0)

  

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

为了澄清,Windows Phone 8上有完整的C#5.0支持.WinRT API主要依赖于async / await,例如同步到PeopleHub或使用I / O API。

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

答案 4 :(得分:0)

WP8具有本机异步/等待支持,但有一些限制,例如缺少HttpClient和其他类。 WP7在VS2010中使用AsyncCTP支持async / await,但在VS2012中最近重新添加为Microsoft.Bcl.Async:
https://nuget.org/packages/Microsoft.Bcl.Async/1.0.12-beta