在IIS中,一个请求会在单个线程上运行吗?

8
我们有一个在IIS中运行的系统。
该系统应始终使用相同的“文化”,但我们不能依赖于服务器设置正确。
一种方法是每次执行ToString时指定文化。
但是,我们想知道,在方法开头设置线程的文化是否可行,并依赖于该方法中的所有代码都在同一线程上运行?
4个回答

19

ASP.NET表现出线程灵活性-在某些情况下,请求可能会在其请求生命周期的特定点从一个线程移动到另一线程。(不是“随处可移”; 这篇博客文章提供了更详细的信息。)

不幸的是,这并没有像它可能会的那样明确记录,并且它相对难以引发-因此,在测试负载下,一切都很好 - 但在生产中,事情会出错。

然而,我一段时间前运行的一些测试(在页面中查找“jskeet”)表明,即使在线程灵活性发挥作用时,Thread.CurrentCulture仍然被保留。


我在想如果你关闭了Web园艺,这会受到什么影响? - Chris Ballance

3
如果您知道希望所有线程的文化保持不变,那么这应该是一个很好的方法。
然而,如果您需要在每个请求基础上设置不同的文化,可能会因为高负载导致线程重用和请求迁移,使得文化(以及其他线程静态信息)被遗忘,这种方法潜在地可能不可靠。

在一个方法块内部,是否真的可能存在线程切换? - Manitra Andriamitondra

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级别似乎是最合适的选择。


1
正如其他人指出的那样,ASP.NET 可能会决定在不同的线程中处理同一请求的部分。然而,您正在谈论在每个方法的开头初始化线程静态内容,因此这个限制不适用于您:我非常确定 ASP.NET 不能在您的某个方法中间更改当前线程,因此您的方法应该是可行的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接