為什麼 CurrentCulture 是 Thread 的屬性?
目前文化資訊(CurrentCulture 和/或 CurrentUICulture)是正在執行的執行緒的屬性,這讓我覺得這是一個奇怪的設計選擇。至少,在流程級別上,此類事情的範圍似乎應該是上一級的。
但是,一旦您聽到基本原理,這些事情通常就會變得有意義。找出為什麼 .NET 設計者認為 Thread 是放置此屬性的正確位置可能會很有啟發性。
首先,這並不是他們的選擇。這個決定是在他們開始之前很久就做出的,文化是作業系統執行緒的屬性。例如,查看 Get/SetThreadLocale() API 函式的 SDK 文件。
這並不能完全解釋這一點,他們已經虛擬化了其他作業系統功能,儘管這個很難虛擬化,因為很多 API 都是文化敏感的,尤其是 COM 的。
下一個很好的理由是因為在整個過程範圍內改變文化非常難以實施。這是一個無法解決的競爭條件。其他一些執行緒很可能正在格式化具有文化親和力的數據。雖然鎖可以防止它在更改時使用區域性屬性,但它不能阻止它在格式化呼叫鏈的中間更改。這將要求他們採取某種全域鎖並在格式化作業期間保持它。死鎖的可能性很大。
這還有另一個方面,我認為這是真正的問題。它與 Thread.ExecutionContext 屬性有關。框架使用它來將執行緒狀態從一個執行緒“流動”到另一個執行緒。將諸如安全上下文之類的東西灌輸到工作執行緒上非常晦澀但很重要。如果該上下文也可以灌輸文化,那將是理想的,這樣您就可以確保您啟動的任何工作人員都具有您選擇的相同文化而不是作業系統預設值。
沒有,我真的不知道為什麼。可能是因為我給出的第一個原因。然而,這確實使得改變執行緒的文化非常危險。可能導致的錯誤類型非常微妙。就像在具有非作業系統預設區域性的主執行緒中創建一個以字元串為鍵的 SortedDictionary。然後發現工作執行緒偶爾不能再找到東西了,因為字元串排序規則不同。
編輯:.NET 4.5 中的這個問題有所緩解,它支持新的靜態 CultureInfo.DefaultThreadCurrentCulture 和 DefaultThreadCurrentUICulture 屬性。
EDIT2:文化現在如 .NET 4.6 第 4 段所述流動。這應該可以緩解所有擔憂。