inf*_*ity 12 c# asp.net async-await dotnet-httpclient
我正在尝试使用"async"和"await"提供的功能来异步下载网页内容,我遇到了任务等待永远完成的问题.你可以告诉我下面的代码片段有什么问题吗?
protected void Page_Load(object sender, EventArgs e)
{
var websites = new string[] {"http://www.cnn.com","http://www.foxnews.com"};
var tasks = websites.Select(GenerateSomeContent).ToList();
//I don't want to use 'await Tasks.WhenAll(tasks)' as I need to block the
//page load until the all the webpage contents are downloaded
Task.WhenAll(tasks).Wait();
//This line is never hit on debugging
var somevalue = "Complete";
}
static async Task<Results> GenerateSomeContent(string url)
{
var client = new HttpClient();
var response = await client.GetAsync(url); //Await for response
var content = await response.Content.ReadAsStringAsync();
var output = new Results {Content = content};
return output;
}
//Sample class to hold results
public class Results
{
public string Content;
}
Run Code Online (Sandbox Code Playgroud)
Ste*_*ary 19
首先,确保您运行的是.NET 4.5,而不是.NET 4.0.ASP.NET是async
在.NET 4.5中生成的.
然后,适当的解决办法是await
的结果Task.WhenAll
:
var tasks = websites.Select(GenerateSomeContent);
await Task.WhenAll(tasks);
Run Code Online (Sandbox Code Playgroud)
ASP.NET管道(仅在.NET 4.5中)将检测到您的代码正在运行await
并将停止该请求,直到Page_Load
运行完成.
在我的博客上解释,Wait
在这种情况下同步阻塞任务会导致死锁.
归档时间: |
|
查看次数: |
6896 次 |
最近记录: |