异步和线程文化

Mis*_*pic 8 c# asp.net-mvc async-await

我有一个MVC应用程序,我覆盖我的基本控制器的OnActionExecuting()方法来设置我的线程文化:

protected override void OnActionExecuting(ActionExecutingContext filterContext) {
    var langCode = GetLangCode();
    Thread.CurrentThread.CurrentUICulture = new CultureInfo(langCode);
    Thread.CurrentThread.CurrentCulture = new CultureInfo(langCode);
}
Run Code Online (Sandbox Code Playgroud)

当我开始异步编程时,如果我们将我们修改过的文化返回到线程池,并且在异步任务完成时调度新线程,我很好奇文化是如何持久化的?我应该知道的任何陷阱?

nos*_*tio 8

一个主要的问题可能是使用该await task.ConfigureAwait(false)模式,这种模式经常被误用为一种简单(但错误)的解决方案来解决死锁问题.这样,继续将在没有同步上下文的池线程上发生.在这种情况下,CurrentCulture不会流动,因为它不会作为一部分流动ExecutionContext.更糟糕的是,您可能正在使用Task.Run(lambda)(通常您不应该在ASP.NET应用程序中使用).里面的代码lambda没有正确的CurrentCulture.

否则,AspNetSynchronizationContext将正确地CurrentCulture跨越awaitcontinuation,即使它们发生在不同的线程上.