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 MVC 中的 Request.IsAjaxRequest() 在哪里?
ASP.Net Core Web Api 中的异步视频流不起作用