编辑:我现在通过简单地将按钮点击处理程序标记为async void并等待任务来解决问题。我认为WebForms无法以任何方式处理异步,除非与RegisterAsyncTask一起使用。虽然这解决了我的问题,但我仍然对代码处于死锁之下的原因感兴趣,因为它违背了我对当前C#代码异步工作的理解,所以仍然赞赏答案。ASP.NET死锁尽管ConfigureAwait(false)
我有一个服务公开了一个异步方法,它向一些api发送一个请求。此方法在webforms代码隐藏中消耗。我知道ASP.NET只允许一次执行一个线程,因此调用Task.Wait()会导致死锁,因为等待处理的任务在上下文线程被阻止时无法在完成时恢复执行。
但是,我的理解(从读this blog),在等待的任务上调用ConfigureAwait(false)
会导致任务在线程池线程上运行,因此可以恢复上下文线程上的执行。尽管如此,我仍然遇到了来自下面代码的僵局。为什么是这样?
protected void Activate(object sender, CommandEventArgs e)
{
var someID = int.Parse((string) e.CommandArgument);
DoAsyncThingWithID(someID).Wait();
}
private async Task DoAsyncThingWithID(int ID)
{
try
{
await new SomeService()
.DoSomeAsyncWork(ID)
.ConfigureAwait(false);
}
catch (AppropriateException e)
{
DealWithIt();
}
}
值得注意的是:DoSomeAsyncWork(int)在它下面有更多的异步方法。在底部有一个API包装对象(负责发送HTTP请求)的方法不是异步,但调用Task.Run(() => api.SendThingy());
这可能是问题吗?
发布你的搜索答案并收听。 –