它使我成为一个奇怪的设计选择,即当前的文化信息(当前文化和/或当前文化)是运行线程的AA属性。至少在过程级别上,这种事物的范围似乎应该是一个水平。

但是,一旦您听到理由,这些事情通常是有道理的。找出.NET设计人员认为线程是放置此属性的正确位置,这可能是启发性的。

有帮助吗?

解决方案

对于初学者来说,这并不是他们的选择。该决定是在开始之前很长时间做出的,文化是操作系统线程的属性。例如,查看get/setThreadLocale()API函数的SDK文档。

这并不能完全解释它,他们具有虚拟化的其他操作系统功能,尽管该功能是 非常 很难虚拟化,因为如此多的API对文化敏感,尤其是COM。

下一个充分的理由是因为更改整个文化过程非常难以实施。这是一种无法解决的比赛条件。其他一些线程很可能处于具有文化亲和力的格式化数据中间。虽然锁可以在更改时可以防止其使用文化属性,但可以 不是 防止其在格式呼叫链中间进行更改。这将要求他们采用某种全球锁定,并在格式化工作期间持有它。僵局是 非常 可能。

这是另一个方面,我认为这是真正的问题。它与thread.ecutionContext属性有关。该框架使用它将线程状态从一个线程“流”到另一个线程。非常晦涩,但对于将安全性上下文(例如安全环境)浸入工人线程中很重要。如果上下文也可以浸入文化,那么您可以确定您所开始的任何工人都具有与您选择的文化相同而不是操作系统默认值相同的文化,那将是理想的选择。

不是,我真的不知道为什么。可能是因为我给出的第一个原因。那 但是,改变线程的文化非常危险。可能导致的错误是 非常 微妙的。就像用字符串作为主线程中的键创建分类数字一样,使用非操作系统默认文化。然后发现工人线程偶尔无法再找到东西,因为字符串排序规则不同。


编辑:在.NET 4.5中,此问题可以缓解,它支持新的static CultureInfo.defaultThreadCurrentcurrentcurrentcurrentulture和DefaultThreadCurrentuIculture属性。


EDIT2:文化现在如.NET 4.6中的第四段所述流动。这应该减轻所有担忧。

其他提示

我会拍摄 - 也许是因为您需要使用不同文化的多个同时线程?如果您想到一个多语言的ASP.NET网站,则不希望该过程与一种语言相关联... Web请求可能是En-us和另一个FR-FR。

窗口手柄本身是特定于线程的。您绝对不要在不同线程的上下文中使用窗口句柄(对于顶级窗口,子控制等),因为实现窗口处理(GDI)的代码本身并不是线程的安全性。由于特定于窗口,因此它也意味着它也在线程级别上定义。

其他GUI方面也是特定于线程的,例如活动窗口和焦点。尽管有一个API,但我不记得这个名称,可以从不同的线程将UI上下文连接在一起,以便在多个用户界面线程之间共享焦点,活动窗口。

当前的文化不过是对文化Info的引用,因此,允许它挂在线程上(仅是一个参考的内存),就不会丢失太多。同时,您可以获得允许用户每线线程来高处控制当前文化的可能性 - 事实证明,在某些应用程序中,这一点很重要。

对于现代软件的非英语用户而言,获得这种细粒度可能更为明显。我必须定期在Windows中切换键盘,并可以通过一个全局键盘快捷键轻松地进行操作。在线程上拥有CultureInfo可以使我们可以轻松地在.NET应用程序中实现类似的逻辑,而无需每个过程更改该信息。

想到的用法示例:

  1. 我可能想要一个快捷方式,可以根据当前用户的要求在短时间内改变计划中的文化(许多应用程序需要允许同一工作站和同一会话中的几个用户)。但是,相同的过程可能必须继续使用机器上的默认文化Info来始终具有相同的时间戳格式的日志。

  2. 您可能还会有一个报告解决方案,该解决方案将抛弃全球公司的多个分支机构的报告,每个公司都有自己的文化。如果您可以更改每个线程的cultureinfo,则您的设计将不太限制。

  3. 另一个原因是,如果您想使用特定文化写入文件,但是您不想在写功能中指定文化(例如,因为这些功能已经编写)。然后,您可以轻松地更改该逻辑,而无需更改其他线程,这些线程可能正在执行需要默认文化的工作。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top