异步和线程文化

Asynchrony and thread culture

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

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

随着我越来越多地开始异步编程,我很好奇如果我们 return 将文化被我们修改到线程池的线程,并且当异步任务完成了吗?有什么我应该注意的问题吗?

简而言之,是的 ASP.NET 配置为通过 SynchronizationContext 在您的异步操作中传递诸如文化之类的东西。您可以在 MSDN 上阅读一些有关它如何工作的信息:https://msdn.microsoft.com/en-us/magazine/gg598924.aspx

您可以在这个 SO 问题上阅读有关身份的一些陷阱:Using ASP.NET Web API, my ExecutionContext isn't flowing in async actions

一个主要问题可能是使用 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 个延续,即使它们发生在不同的线程上。