gpt4 book ai didi

c# - MVC Controller 无法执行异步方法

转载 作者:太空狗 更新时间:2023-10-29 17:47:58 24 4
gpt4 key购买 nike

我有一个非常基本的 MVC Controller ,只有一个操作:

public class HomeController : Controller
{
public ActionResult Index()
{
OpenConnection().Wait();

return View();
}

private async Task OpenConnection()
{
var synchronizationContext = SynchronizationContext.Current;
Debug.Assert(synchronizationContext != null);

using (
var connection =
new SqlConnection(
@"Data Source=(localdb)\ProjectsV12;Initial Catalog=Database1;Integrated Security=True;"))
{
await connection.OpenAsync(); // this always hangs up
}
}
}

问题是常规操作(非异步版本)无法执行异步方法。在我的例子中,OpenConnection() 方法总是卡在 await connection.OpenAsync() 行。

一段时间后,我发现了两种使这段代码工作的方法。

  1. 使 Controller 的 Action 异步

    public async Task<ActionResult> Index()
    {
    await OpenConnection();

    return View();
    }
  2. 或者允许异步执行而不捕获原始 SychronizationContext - 为此:

    等待连接.OpenAsync();

    替换为:

    等待连接.OpenAsync().ConfigureAwait(false);

因此,我的猜测是我最初的问题出在 SynchronizationContext 附近。但是 SynchronizationContext.Current 不为空,这让我想知道我的猜测是否正确。

那么,有人能解释一下,为什么 MVC Controller 中的非异步操作不能同步执行异步方法吗?

最佳答案

Stephen Cleary 有一个 good blog post about this issue它会影响 ASP.NET 和桌面应用程序。基本要点是,因为上下文(您的示例中的 ASP.NET 请求上下文)被您的显式 .Wait() 调用同步阻止,异步任务无法在上下文上运行代码以通知它已完成,因此它陷入僵局。

他还提出了与您相同的两个解决方案(从顶级 Controller 方法一直使用异步或更改您的异步“库”代码以不捕获上下文)。

关于c# - MVC Controller 无法执行异步方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29883880/

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