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我实际上一直在做这个实验。我把代码贴出来了,这样你就可以玩了。实际上,使用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/