gpt4 book ai didi

c# - 异步 CTP 错误 - 任务永远无法完成

转载 作者:太空狗 更新时间:2023-10-30 01:09:04 24 4
gpt4 key购买 nike

首先向您道歉:我无法将以下错误隔离到一个简单的控制台应用程序中。但是,在我相对简单的 ASP.NET Web 窗体应用程序中,以下代码将导致当前线程无限期阻塞:

public class MyModule : IHttpModule
{
public void Dispose()
{
}

public void Init(System.Web.HttpApplication context)
{
context.BeginRequest += this.Context_BeginRequest;
}

private void Context_BeginRequest(object sender, EventArgs e)
{
Sleep().Wait();
var x = 2; // This line is never hit.
}

private async Task Sleep()
{
await TaskEx.Run(() => System.Threading.Thread.Sleep(1000));
}
}

任务状态保持为“WaitingForActivation”。有谁知道为什么会这样?

最佳答案

编辑:Stephen Cleary 的评论提供了更多信息:

AspNetSynchronizationContext is the strangest implementation. It treats Post as synchronous rather than asynchronous and uses a lock to execute its delegates one at a time. AspNetSynchronizationContext does not require marshaling back to the same thread (but does need to take the lock); the deadlock on Wait is because the continuation is waiting for the lock (held by the thread in the event handler)


我的 猜测 是有一个 SynchronizationContext 强制继续在与事件处理程序相同的线程上运行。您的事件处理程序正在阻塞该线程,因此延续永远不会运行,这意味着事件处理程序永远不会解除阻塞

虽然这只是一个猜测 - 这是我目前唯一能想到的有意义的事情。

尝试取消阻止的一个方法是将您的Sleep 方法更改为:

private async Task Sleep()
{
await TaskEx.Run(() => System.Threading.Thread.Sleep(1000))
.ConfigureAwait(continueOnCapturedContext: false);
}

这将允许继续在不同的上下文中完成。

我很惊讶这样的同步上下文,请注意...我希望所有这些都发生在线程池上。可能对 BeginRequest 进行了特殊处理。

关于c# - 异步 CTP 错误 - 任务永远无法完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7804363/

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