我正在尝试使用“异步”和“等待”提供的功能来异步下载网页内容,但我遇到了任务永远等待完成的问题。您能否让我知道以下代码片段有什么问题?
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;
}
首先,确保您在 .NET 4.5 上运行,而不是 .NET 4.0。 ASP.NET 诞生了async
-.NET 4.5 中感知。
那么,正确的解决办法是await
的结果Task.WhenAll
:
var tasks = websites.Select(GenerateSomeContent);
await Task.WhenAll(tasks);
ASP.NET 管道(仅在 .NET 4.5 中)将检测到您的代码是await
ing 并将暂停该请求直到Page_Load
运行至完成。
使用同步阻塞任务Wait
在这种情况下会导致僵局正如我在博客上解释的那样 http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)