C# 异步任务无限期等待

标签 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;
}

最佳答案

首先,确保您运行的是 .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 同步阻塞任务在这种情况下会导致死锁 as I explain on my blog .

关于C# 异步任务无限期等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14150247/

相关文章:

c# - Azure 解决方案设计指南

c# - 异步任务给出警告,(没有)异步任务给出错误

.net - 将现有 ASP.NET MVC 应用程序与 Orchard CMS 集成

c# - ASP.NET Web 应用程序中的身份验证遇到问题

c# - async Task<object> 函数死锁

c# - 正则表达式检查字符串是否仅包含数字并且长度为 11 个字符/数字?

c# - 使用 ngen.exe 创建和分发 native 镜像

asp.net - asp.net 中的嵌套 css 值

f# - 等待 System.Threading.Task 并忽略结果?

c# - 为什么使用 Task.Run() 仍然阻塞我的 UI?