c# - 在使用异步的 .NET MVC/WebApi 应用程序中处理 Culture 的最佳方法是什么?

标签 c# asp.net .net multithreading cultureinfo

我有一个 .NET MVC/WebApi 应用程序,它在 ASP.NET AcquireRequestState 事件期间为当前线程设置文化(我们使用自定义逻辑来确定每个用户的首选 ui 文化)。虽然这适用于同步情况,但我担心它在使用异步或显式多线程或后台线程(例如使用 Task.Run())时不起作用。

与随控制逻辑流流动的 Thread.CurrentPrincipal 不同,文化似乎只是随线程流动:

Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(FigureOutUsersCulture());
Task.Run(() => Thread.CurrentThread.CurrentUICulture.Dump()); // en-US

为此类应用程序设置文化的最可靠方法是什么?

注意:对于要求每个使用异步/等待或其他线程的开发人员记住初始化文化的任何答案,我并不感到兴奋。如果可能的话,我想要跨 async/await 的健壮的东西。如果这真的不可能,我当然也会接受这个答案。

编辑: 我知道如果您不在请求线程期间等待任务,则在 ASP.NET 中使用 Task.Run() 会出现问题。也就是说,我正在尝试编写基础架构以尽可能以最可靠的方式进行设置。我不知道其他开发者会做什么,所以如果我能做好准备,我愿意。

编辑: 关于发布的“可能重复”的注释。我同意这两个问题都是相关的,但它们并不相同!有人询问是否为整个应用程序设置一种文化,这与我正在尝试做的相反。另一个解决 MVC3 风格的异步 Controller 的设置文化,这是我想要完成的一小部分(对我来说,基本上不相关)。

最佳答案

Kyle 关于将文化不变作业委托(delegate)给其他线程(或在应用程序池中安排)的建议是明智的。如果工作确实需要了解文化,请将其作为参数传递。

简单地使用 await 而不使用任何花哨的技巧,例如 ConfigureAwait(false) 将在延续中保留 HttpContext 和线程文化,所以我会这样做*。我没有看到任何与 AspNetSynchronizationContext 性能相关的问题 (https://stackoverflow.com/a/13494570/289992),您选择 c# 的原因是享受它的生产力优势。

*如果您正在编写库代码,您可以考虑 ConfigureAwait(false)。同样,您要确保所有“正常环境”信息(Context.Current、CurrentUICulture 等)都作为参数传入。 CultureAwaiter 也有一些像这样的好技巧,也许你可以从中得到一些东西。也许您会想阅读 the costs 并自行决定实现这些优化是否值得您花时间。

关于c# - 在使用异步的 .NET MVC/WebApi 应用程序中处理 Culture 的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25432392/

相关文章:

c# - 数据库类中的连接泄漏

.net - 编译 .net 应用程序时出现错误

c# - 算术运算导致溢出。 (添加整数)

c# - 使用 RSACryptoServiceProvider 从 XML 导入 RSA 公钥将属性 PublicOnly 设置为 false

c# - 如何使用 Asp.Net 生成 RSS

asp.net - asp.net如何在特定日期和时间执行点击事件?

c# - 如何将自动生成的列移到左侧?

.net - 数据绑定(bind) : Validate before change

c# - c#、java中的null是什么?

c# - 使用具有单个 DbContext 和 Entites 的多个数据库并在运行时生成 Conn String