【问题标题】:What's the best way to handle Culture in a .NET MVC/WebApi app which uses async?在使用异步的 .NET MVC/WebApi 应用程序中处理文化的最佳方法是什么?
【发布时间】:2014-08-21 17:28:10
【问题描述】:

我有一个 .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 或其他线程的开发人员记住初始化文化的答案,我并不感到兴奋。如果可能的话,我想要跨 async/await 的强大功能。如果这真的不可能,我当然也会接受这个答案。

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

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

【问题讨论】:

  • 您根本不应该在 ASP.NET 中使用 Task.Run。您使用的是哪个 .NET Framework 版本?
  • @SteveCzetty:查看我的编辑。我认为我的问题更广泛
  • @HamletHakobyan:查看我的编辑;我觉得我的问题有点不同。
  • @EugenePodskal:你能解释一下为什么你认为我的问题是重复的吗?两个链接的问题都不一样!

标签: c# asp.net .net multithreading cultureinfo


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    鉴于“可能重复”的 cmets,我不确定是否有比 EZI 所说的更好的答案。如果你想创建一个新线程,你需要告诉它文化。

    一个更好的问题可能是为什么您需要其他线程中的文化?让这些线程为你工作,然后当你回到主线程时,你可以将信息转换为字符串或你有什么。这可能不合适,因为我不知道线程到底在做什么。

    【讨论】:

    • 异步控制器呢? ASP.NET 是否做了一些神奇的事情来使文化在等待边界上正确流动?如果使用 ConfigureAwait(false) 会怎样?
    猜你喜欢
    • 2017-09-30
    • 1970-01-01
    • 1970-01-01
    • 2013-10-13
    • 1970-01-01
    • 2017-01-14
    • 2020-06-19
    • 2011-11-30
    • 1970-01-01
    相关资源
    最近更新 更多