异步和线程文化
我有一个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没有流入异步动作