ASP.NET Core 1.0 同步上下文

7

在ASP.NET Core 1.0网站中,SynchronizationContext是否为空? 在我的系统上,此代码会抛出异常:

        app.Use(async (context, next) =>
        {
            var sc = System.Threading.SynchronizationContext.Current;
            if (sc == null)
            {
                throw new Exception("SynchronizationContext is null");
            }

这不是一个重复的内容! - tugberk
1个回答

13

在ASP.NET 5中已经没有了它,因为你不需要它的功能。它的全部目的是流动HttpContext.Current,而这个已经不存在了。

我认为它还与当前文化有关,但我不确定现在如何处理。


1
为了使当前文化“异步友好”,实际上有两种策略:在CoreCLR和.NET 4.6上,使用特殊的Switch.System.Globalization.NoAsyncCurrentCulture标志:以前由dnx的Bootstrapper设置为false,但现在直接在mscorlib中处理:https://github.com/dotnet/coreclr/blob/master/src/mscorlib/src/System/AppContext/AppContextDefaultValues.Defaults.cs。在.NET <4.5.2上,使用特殊的HostExecutionContextManager代替:https://github.com/aspnet/dnx/blob/dev/src/dnx.clr.managed/DnxHostExecutionContextManager.cs。 - Kévin Chalet
通过访问器(就像HttpContext一样)流动文化,这将非常酷。 - tugberk
我错误地以为 ASP.NET 5 有类似 node 的单线程执行。这意味着上下文可以由单独的线程处理,并且 await 可能会将您带到另一个线程吗? - Tom Deseyn
@MasterT 不确定我是否理解了。我想表达的是,在新世界中,没有静态的 HttpContext.Current。因此,在线程之间共享它是一项艰巨的工作(据我所知,在 System.Web 中实现了 SynchronizationContext)。 - tugberk
1
@MasterT 是的,对于尚未完成的 Task 上进行的任何 await 调用都可能导致线程切换。 - Kévin Chalet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接