Windows Phone上的c#异步HTTPWebRequest

本文关键字:异步 HTTPWebRequest 上的 Phone Windows | 更新日期: 2023-09-27 18:15:00

我是。net和Windows Phone开发的新手。我目前正在研究通过HTTPWebrequest类进行异步web请求的不同方法。

异步和等待:

async and await似乎是一种简洁的异步web请求方式:http://blog.stephencleary.com/2012/02/async-and-await.html。我唯一担心的是,根据文档,调用方法线程会在Task执行时被挂起。我想要调用方法立即返回,我该怎么做?

public async Task NewStuffAsync()
{
  // Use await and have fun with the new stuff.
  await ...
}
public Task MyOldTaskParallelLibraryCode()
{
  // Note that this is not an async method, so we can't use await in here.
  ...
}
public async Task ComposeAsync()
{
  // We can await Tasks, regardless of where they come from.
  await NewStuffAsync();
  await MyOldTaskParallelLibraryCode();
}

HttpWebRequest。BeginGetResponse

下面是一个来自微软的例子:http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.begingetresponse.aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-2

我想了解与回调相关的开销。

ThreadPool

Managed ThreadPool似乎是健壮的。我想再次了解与之相关的开销。

http://msdn.microsoft.com/en-us/library/0ka9477y.aspx

Windows Phone上的c#异步HTTPWebRequest

我实际上一直在做这个实验。我把代码贴出来了,这样你就可以玩了。实际上,使用async/await和使用回调是有区别的。async/await对我来说更自然。

考虑下面的代码。顺便说一下,这是一个控制台应用程序。这两个代码实现相同的功能。

    static void Main(string[] args)
    {
        MakeRequest();       
        Console.ReadLine();
    }
    private static async void MakeRequest()
    {
        await UseHttpClient();
        UseWebClient();
    }
    private static async Task UseHttpClient()
    {
        Console.WriteLine("=== HttpClient ==");
        var client = new HttpClient();
        var request = new HttpRequestMessage(HttpMethod.Get, new Uri("http://www.google.com"));
        Console.WriteLine("HttpClient requesting...");
        var response = await client.SendAsync(request);
        Console.WriteLine(response.Content.ReadAsStringAsync().Result.Substring(0,100));
        Console.WriteLine("HttpClient done");
    }
    private static void UseWebClient()
    {
        Console.WriteLine("=== WebClient ==");
        var webClient = new WebClient();
        webClient.DownloadStringAsync(new Uri("http://www.google.com"));
        Console.WriteLine("WebClient requesting...");
        webClient.DownloadStringCompleted += (sender, eventArgs) => Console.WriteLine(eventArgs.Result.Substring(0,100));
        Console.WriteLine("WebClient done.");
    }

输出如下:

For HttpClient

=== HttpClient ==
HttpClient requesting...
<!doctype html><html itemscope="itemscope" itemtype="http://schema.org/WebPage">
<head><meta itemprop
HttpClient done

对于WebClient使用回调

=== WebClient ==
WebClient requesting...
WebClient done.
<!doctype html><html itemscope="itemscope" itemtype="http://schema.org/WebPage">
<head><meta itemprop

可以看到,HttpClient实际上在继续执行流之前先等待结果(它实际上返回给调用者)。因此,关键字await,它等待并稍后执行。

但是当使用回调时,流程是完全不同的。您的代码流是连续的(这就是为什么您可以看到在实际结果之前打印WebClient done。为了实现与async/await相同的流,有多种方法。其中一种方法是利用TCS并将函数封装在它周围(我在这里不再赘述,因为这个问题已经讨论过很多次了)。最简单的方法是使用HttpClient

希望它有助于理解async/await和使用回调。

我建议安装Microsoft.Net.Http NuGet包并使用HttpClient。

我唯一担心的是,根据文档,调用方法线程会在Task执行时被挂起。

没有;对于async/await,您可以这样考虑:方法被挂起,但是线程返回并继续运行。所以UI保持响应。

正如Blounty建议的那样,检查Microsoft.Net.Http包中的HttpClient(目前在RC中)。

我有同样的问题,我发现这个并帮助我

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/