异步和线程文化

时间:2015-01-29 18:02:31

标签: 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);
}

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

2 个答案:

答案 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