异步和线程文化

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

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

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

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

否则, AspNetSynchronizationContext将在await延续期间正确地AspNetSynchronizationContext CurrentCulture ,即使它们发生在不同的线程上。

简而言之,是的,ASP.NET配置为通过SynchronizationContext在异步操作中传递文化等内容。 您可以在MSDN上阅读它的工作原理: https : //msdn.microsoft.com/en-us/magazine/gg598924.aspx

在这个问题上你可以阅读一些与身份相关的问题: 使用ASP.NET Web API,我的ExecutionContext没有流入异步动作