gpt4 book ai didi

c# - 使用Task()时IIS失败

转载 作者:行者123 更新时间:2023-12-03 13:17:43 26 4
gpt4 key购买 nike

我有一个WebAPI ASP.NET解决方案。我已经将web.config设置为:

<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />

在通话中,我需要获取3个任务的结果(每个任务10秒):
 Task<Cat> catAsync = GetCatAsync();
Task<Dog> dogAsync = GetDogAsync();
Task<Pig> pigAsync = GetPigAsync();

await Task.WhenAll(catAsync , dogAsync , pigAsync );

cat= catAsync.Result;
dog= dogAsync.Result;
pig= pigAsync.Result;

我可以调用它一次,但是随后对此的调用似乎只是死于线程中,Cat和Dog可能会运行,但是Pig似乎会消失。一分钟左右后,这些开始出现:
The thread '<No Name>' (0x2f60) has exited with code 0 (0x0).
The thread '<No Name>' (0x974) has exited with code 0 (0x0).
The thread '<No Name>' (0x1ea8) has exited with code 0 (0x0).

我的任务如下所示:
    private async Task<Cat> CatAsync()
{
await Task.Run(() =>
{
//Use WCF to get some data from a service
});

return cat;
}

运行IISRESET,让我再次运行该站点一次。

* 编辑

阅读Panagiotis Kanavos的答案后,我在下面的示例中发布了适用于该示例的解决方案

最佳答案

其他人建议的问题是同步上下文。等待在开始等待的同步上下文(基本上是线程)中恢复执行。如果该线程已被阻止,例如。通过等待其他事情,代码陷入僵局。

为避免这种情况,应在对await的任何调用之后再调用ConfigureAwait(false),以使运行时在另一个线程中继续进行。

以下代码将顺利运行。尽管删除任何ConfigureAwait调用都将导致死锁。

此外,只要使用xxxAsync方法,就不需要在Task.Run内进行WCF调用。这也使代码更简洁

最后,如果您只想等待完成,则应使用Task.WaitAll()而不是等待Task.WhenAll()。 Task.WaitAll()不会与同步上下文混淆,因此您无需添加另一个ConfigureAwait()

protected void Page_Load(object sender, EventArgs e)
{
var results = GetThem().Result;

}

private async Task<Tuple<Cat,Dog,Pig>> GetThem()
{
Task<Cat> catAsync = GetCatAsync();
Task<Dog> dogAsync = GetDogAsync();
Task<Pig> pigAsync = GetPigAsync();

await Task.WhenAll(catAsync, dogAsync, pigAsync).ConfigureAwait(false);
//better yet,
// Task.WaitAll(catAsync, dogAsync, pigAsync);

var cat = catAsync.Result;
var dog = dogAsync.Result;
var pig = pigAsync.Result;
return Tuple.Create(cat, dog, pig);
}

private async Task<Pig> GetPigAsync()
{
var cat = new Pig();
var res = await GetGoogleSearchHTML("cat").ConfigureAwait(false);
using (StreamReader sr = new StreamReader(res.GetResponseStream()))
{
cat.Name = await sr.ReadToEndAsync().ConfigureAwait(false);
}

return cat;
}

public async Task<WebResponse> GetGoogleSearchHTML(string type)
{
System.Net.WebRequest request = System.Net.HttpWebRequest.Create(String.Format("http://www.google.com/search?noj=1&site=cat&source=hp&q={0}&oq=search", type));
System.Net.WebResponse response = await request.GetResponseAsync().ConfigureAwait(false);
return response;
}

关于c# - 使用Task()时IIS失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17202709/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com