为什么CurrentCulture是Thread的属性?

I. *_*edy 7 .net cultureinfo currentculture

作为一个奇怪的设计选择,当前的文化信息(CurrentCulture和/或CurrentUICulture)是正在运行的线程的属性,这让我感到震惊.至少看起来这样的事情的范围应该是一个级别,在过程级别.

但是一旦你听到这个理由,这些事情通常都有意义.找出为什么.NET设计者认为Thread是放置这个属性的正确位置可能很有启发性.

Han*_*ant 10

对于初学者来说,这不是他们的选择.这个决定在他们开始之前已经做了很长时间,文化是操作系统线程的属性.例如,查看Get/SetThreadLocale()API函数的SDK文档.

这并没有完全解释它,它们已经虚拟化了其他操作系统功能,尽管这个功能非常难以虚拟化,因为许多API对文化敏感,尤其是COM.

下一个很好的理由是因为在整个过程中改变文化是非常难以实施的.这是一个无法解决的竞争条件.其他一些线程可能正在格式化具有文化亲和力的数据.虽然锁可以阻止它在更改时使用文化属性,但它无法阻止它在格式化调用链的中间进行更改.它需要它们采取某种全局锁定并在格式化作业期间保持它.僵局非常可能.

还有另外一个方面,我认为这是一个真正的问题.它与Thread.ExecutionContext属性有关.框架使用它将线程状态从一个线程"流"到另一个线程.非常模糊但很重要的是将安全上下文等内容灌输到工作线程上.如果上下文也可以灌输文化,那么您可以确定您开始的任何工作者都具有您选择的相同文化而不是操作系统默认值,这将是理想的.

它没有,我真的不知道为什么.可能是因为我给出的第一个原因.然而,这确实改变了一个线程的文化是非常危险的.可能导致的那种错误非常微妙.就像创建一个SortedDictionary,其中一个字符串作为主线程中的键,具有非操作系统默认文化.然后发现工作线程不能偶尔找回东西,因为字符串排序规则是不同的.


编辑:在.NET 4.5中,这个问题有所缓解,它支持新的静态CultureInfo.DefaultThreadCurrentCulture和DefaultThreadCurrentUICulture属性.


EDIT2:文化现在按照.NET 4.6第4段中的描述流动.这应该可以缓解所有问题.


小智 6

我会拍摄 - 也许是因为你需要使用不同文化的多个同时线程?如果你想到一个多语言的asp.net网站,你不希望这个过程与一种语言联系在一起......一个网络请求可能是EN-US和另一个fr-FR.