异步和线程文化
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
个延续,即使它们发生在不同的线程上。
我有一个 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
个延续,即使它们发生在不同的线程上。