我有一个MVC应用程序,我覆盖我的基本控制器的OnActionExecuting()
方法来设置我的线程文化:
protected override void OnActionExecuting(ActionExecutingContext filterContext) {
var langCode = GetLangCode();
Thread.CurrentThread.CurrentUICulture = new CultureInfo(langCode);
Thread.CurrentThread.CurrentCulture = new CultureInfo(langCode);
}
当我开始异步编程时,我很好奇文化是如何持久化的,如果我们将我们修改过的文化返回到线程池,并在异步任务完成时调度新线程?我应该注意哪些问题?
答案 0 :(得分:7)
一个主要问题可能是使用await task.ConfigureAwait(false)
模式,这种模式经常被误用为对死锁的一种简单(但错误)的补救措施。这样,继续将在没有同步上下文的池线程上发生。在这种情况下,CurrentCulture
将不会流动,因为it doesn't get flowed as a part of ExecutionContext
。更糟糕的是,您可能正在使用Task.Run(lambda)
(通常您不应该在ASP.NET应用程序中)。 lambda
中的代码将没有正确的CurrentCulture
。
否则,AspNetSynchronizationContext
将在CurrentCulture
个续集中正确地传递await
,即使它们发生在不同的线程上。
答案 1 :(得分:3)
简而言之,是的,ASP.NET配置为通过SynchronizationContext
在异步操作中传递文化等内容。您可以在MSDN上了解它的工作原理:https://msdn.microsoft.com/en-us/magazine/gg598924.aspx
在这个问题上你可以阅读一些与身份相关的问题:Using ASP.NET Web API, my ExecutionContext isn't flowing in async actions