我可以阻止MVC Core中的异步代码吗?

Kap*_*pol 13 c# async-await asp.net-core-mvc

我们都知道斯蒂芬克莱里关于阻止异步代码的着名博文.在MVC 5中,以下代码在请求时死锁Home/Index:

public class HomeController : Controller
{
    public string Index()
    {
        var model = AsyncMethod();
        return model.Result;
    }

    private async Task<string> AsyncMethod()
    {
        await Task.Run(() => Thread.Sleep(2000));
        return "Hello";
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,完全相同的代码在MVC Core Web应用程序中不会死锁.响应返回Hello.为什么?MVC Core是否允许多个线程在一个请求上下文中同时运行?在MVC Core中开发时,不要阻止异步代码短语过时吗?

Ste*_*ary 11

为什么?

ASP.NET Core async从上到下,它的设计旨在实现最高速度.

作为重新设计的一部分,ASP.NET团队能够AspNetSynchronizationContext完全删除整个.ASP.NET请求上下文的某些方面被移动到核心.NET中,而其他方面则被删除(例如HttpContext.Current).

MVC Core是否允许多个线程在一个请求上下文中同时运行?

不过,"请求上下文"的概念不再由同步上下文表示.

在MVC Core中开发时,不要阻止异步代码短语过时吗?

不,它不会在ASP.NET Core上死锁,但你仍然不应该这样做.

"我可以阻止MVC Core中的异步代码吗?" 是."我应该阻止MVC Core中的异步代码吗?" 没有.