【发布时间】:2010-12-11 06:25:42
【问题描述】:
我们有一个在 IIS 中运行的系统。
系统应该始终使用相同的“文化”运行,但我们不能依赖正确设置的服务器设置。
一种方法是在每次执行 ToString 时指定文化。
但是,我们想知道,是否可以在方法开始时在线程上设置区域性并依赖该方法中的所有代码在同一线程上运行?
【问题讨论】:
标签: c# asp.net iis multithreading
我们有一个在 IIS 中运行的系统。
系统应该始终使用相同的“文化”运行,但我们不能依赖正确设置的服务器设置。
一种方法是在每次执行 ToString 时指定文化。
但是,我们想知道,是否可以在方法开始时在线程上设置区域性并依赖该方法中的所有代码在同一线程上运行?
【问题讨论】:
标签: c# asp.net iis multithreading
如果您知道您希望所有线程的文化保持不变,那么这应该是一个不错的方法。
但是,如果您需要在每个请求的基础上设置文化,可能会因一个请求与下一个请求不同,那么这可能可能不是一种可靠的方法。在高负载下,我们看到线程被重复用于多个请求,并且请求从一个线程迁移到另一个线程,从而将它们的文化(和其他线程静态信息)抛在脑后。
【讨论】:
没有。 ASP.NET 表现出线程敏捷性 - 在某些情况下,请求可能会在其请求生命周期的特定时间点从一个线程移动到另一个线程。 (它不是“随处可见”;this blog post 提供了更具体的细节。)
不幸的是,这并没有像它可能的那样清楚地记录下来,而且它相对难以引起 - 所以你可以很容易地进入在测试负载下一切都很好 - 但在生产中出现问题的情况。
然而,一些tests I ran a while ago(在页面中寻找“jskeet”)建议Thread.CurrentCulture即使在线程敏捷启动时也会保留。
【讨论】:
你会动态改变文化吗?如果没有,您可以在 web.config 文件中设置文化。
<system.web>
<globalization culture="ja-JP" uiCulture="zh-HK" />
</system.web>
您也可以在页面级别进行设置:
<%@Page Culture="fr-FR" Language="C#" %>
在线程上:
Thread.CurrentThread.CurrentCulture = new CultureInfo("de-DE");
但对于您所使用的,页面级别或 web.config 级别似乎是最合适的。
【讨论】:
正如其他人指出的那样,ASP.NET 可能决定在不同线程中处理相同请求的部分内容。但是,您正在谈论在每个方法的开头初始化线程静态的东西,所以这个限制不适用于您:我很确定 ASP.NET 不能更改当前线程 在你的一种方法的中间,所以你的方法应该没问题。
【讨论】: