我们有一个在IIS中运行的系统。
系统应始终使用相同的“文化”运行,但我们不能依赖正确设置的服务器设置。
一种方法是每次进行ToString时指定文化。
但是,我们想知道,是否有可能在方法开始时在一个线程上设置文化并依赖该方法中的所有代码在同一个线程上运行?
答案 0 :(得分:18)
没有。 ASP.NET展示线程敏捷性 - 在某些情况下,请求可能会在其请求生命周期中的特定点从一个线程移动到另一个线程。 (它不是“只是在任何地方”; this blog post提供了更具体的细节。)
不幸的是,这并没有像它可能那样清楚地记录下来,并且它很难被激发 - 所以你可以很容易地进入测试负载的情况,一切都很好 - 但是在生产中出错了。
但是,某些tests I ran a while ago(在页面中查找“jskeet”)表明,即使线程敏捷性开始,Thread.CurrentCulture
也会保留。
答案 1 :(得分:3)
如果您知道您希望所有线程的文化保持不变,那么这应该是一个很好的方法。
但是,如果您需要根据每个请求设置文化,这可能与一个请求不同,那么可能不是一个可靠的方法。在高负载下,我们看到线程被重用于多个请求和请求从一个线程迁移到另一个线程,留下了它们的文化(和其他线程静态信息)。
答案 2 :(得分:2)
你是否动态改变文化?如果没有,您可以在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级别似乎也是最合适的。
答案 3 :(得分:1)
正如其他人所指出的,ASP.NET可能决定在不同的线程中处理相同请求的部分内容。但是,您正在讨论在每个方法的开头初始化线程静态内容,因此此限制不适用于您:我非常确定ASP.NET无法更改当前线程在你的一个方法中间,所以你的方法应该没问题。