C# 异步和线程区域性

C# 异步和线程区域性,c#,asp.net-mvc,async-await,C#,Asp.net Mvc,Async Await,我有一个MVC应用程序,我在其中重写基本控制器的OnActionExecuting()方法来设置线程区域性: protected override void OnActionExecuting(ActionExecutingContext filterContext) { var langCode = GetLangCode(); Thread.CurrentThread.CurrentUICulture = new CultureInfo(langCode); Thre

我有一个MVC应用程序,我在其中重写基本控制器的
OnActionExecuting()
方法来设置线程区域性:

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

随着我开始更多地异步编程,我很好奇如果我们将其区域性已修改的线程返回到线程池,并且在异步任务完成时调度一个新线程,那么区域性是如何持久化的?我应该知道的任何问题?

简言之,是的,ASP.NET配置为通过同步上下文在异步操作中传递文化等内容。您可以阅读一些有关它如何在MSDN上工作的信息:


关于这个SO问题,您可以阅读到一些与身份相关的问题:

一个主要的问题可能是使用了
等待任务。ConfigureAwait(false)
模式,它经常被误用为一种简单(但错误)的死锁补救方法。这样,延续将在没有同步上下文的池线程上发生。在这种情况下,
CurrentCulture
将不会流动,因为。更糟糕的是,您可能正在使用
Task.Run(lambda)
(在ASP.NET应用程序中通常不应该使用)。
lambda
中的代码将不具有正确的
CurrentCulture


否则,
AspNetSynchronizationContext
将在
await
continuations之间正确流动
CurrentCulture
,即使它们发生在不同的线程上。

由该线程处理的下一个请求不也要经过
OnActionExecuting
的过程吗?@LasseV.Karlsen每个请求都应该执行
OnActionExecuting
,但是每个请求不能由多个线程来处理吗?如果在我的数据访问层中,我使用一个异步模型与数据库通信,那么在请求过程中,我不能获得两个单独的线程,一个线程的区域性已被修改,另一个线程的区域性未被修改?这似乎是可能的,对此我了解得不够,抱歉。你有没有可能正在使用.NET4.5?如果是这样的话,看看@YuvalItzchakov,的确:)我的新生儿坚持说我应该更多地和他在一起,而不是这样:)恭喜!!绝对是优先权变换器;)@尤瓦利扎科夫,谢谢你!事实上,这比我想象的要有趣得多,非常开心:)