ASP.NET Core 中的异步延续在哪里排队?

Posted

技术标签:

【中文标题】ASP.NET Core 中的异步延续在哪里排队?【英文标题】:Where is asynchronous continuations are queued in ASP.NET Core? 【发布时间】:2019-05-22 02:49:51 【问题描述】:

在旧版 ASP.NET 上,异步方法的延续排队到请求上下文 (AspNetSynchronizationContext)。但是在 ASP.NET Core 上,没有这样的 SynchronizationContext(无上下文)。

那么,在 ASP.NET Core 中排队的异步延续在哪里?

在这个contextless条件下,HttpContext 信息存储在哪里,以便 ThreadPool 中的线程可以引用它?

【问题讨论】:

HttpContext 没有集中存储;它存储在每个控制器类实例中。 @Slaks,你能告诉我更多细节吗?我认为有一种方法可以让多个线程使用 HttpContext 对象,对吧?那么,存储 HttpContext 对象的确切线程是哪个?谢谢! 不存在这样的机制。相反,您可以从您的类中访问上下文,该类将其存储在一个字段中。 【参考方案1】:

我强烈建议您阅读Stephen Cleary 博客,甚至his book。在this post 中,他谈到了 ASP.NET Core 中的同步上下文。

我突出显示这一段:

使用无上下文的 ASP.NET Core 方法,当异步 处理程序恢复执行,从线程池中取出一个线程并 执行延续。避免了上下文队列,并且有 不需要“进入”请求上下文。除此之外 async/await 机制针对无上下文进行了高度优化 设想。异步请求要做的工作更少。

【讨论】:

感谢@harkoded 的建议,我之前读过他的帖子。我只是想知道如果 HttpContext 是无服务器的,它如何在 ASP.NET Core 中工作(HttpContext 信息存储在哪里,以便 ThreadPool 中的线程可以引用它?)。在旧版 ASP.NET 中,如果我们在 UI 线程上,我们只能访问 HttpContext 对象。如果我们不在 UI 线程上,访问 System.Web.HttpContext.Current.Items["abc"] 将引发异常。参考***.com/questions/29268001/…

以上是关于ASP.NET Core 中的异步延续在哪里排队?的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core 中的 PostAsJsonAsync 方法在哪里?

ASP.NET Core 中的 NuGet 包位置在哪里?

Asp.Net Core MVC 中的 Request.IsAjaxRequest() 在哪里?

ASP.Net Core Web Api 中的异步视频流不起作用

asp.net mvc 设置一个action的访问人数,达到上线排队

asp.Net core 2.2中的多种身份验证方法