![](/img/trans.png)
[英]How to set the value of main thread's CultureInfo.CurrentUICulture from a child thread in .NET Core 3.1?
[英]Is it possible to set the CultureInfo for an .NET application or just a thread?
我有一個用C#編寫的應用程序,它沒有GUI或UI,但是寫的是由另一個應用程序(以XML和其他形式)解析的文件。
我有一個客戶,其CultureInfo將NumberDecimalSeparator設置為逗號,這會導致解析帶有浮點數的錯誤(PI最終為3,1415 )。
我想為所有線程在應用程序中全局設置CultureInfo的方法。 我試過了:
更改為使用顯式格式不是一個選擇(超過15萬行,大多數由前員工編寫)。
[編輯]該應用程序綁定到套接字並處理來自專用客戶端的請求。 根據請求類型,它產生不同的處理程序類。
抱歉,當我第一次發布時,我應該在#1中闡明( 我雖然 ), 但我也已經在所有顯式產生的處理程序中做到了這一點。
原來,我錯過了導致問題的線程/處理程序。 因此,應用程序現在可以正常工作,但是問題仍然在於是否可以在所有線程上設置區域性。
如果它可以遍歷所有線程,那么它也將解決該問題。 所以:
如何獲取當前進程中的所有Thread對象(不是ProcessThread )?
在.NET 4.5中,您可以使用CultureInfo.DefaultThreadCurrentCulture
不幸的是,每個新線程都以系統語言環境信息開頭,即使它是從已將其語言環境更改為其他內容的線程開始的。
使用BackgroundWorker
加載文件時,這是我遇到的一個巨大難題。
我成功使用的方法是在啟動線程上設置語言環境,然后使用線程工廠通過“應用程序語言環境”創建線程。 對於BackgroundWorkers,您可以使用工廠或派生類,因為Thread
是密封的,而BackgroundWorker
不是。
我認為您不能為整個應用程序設置區域性,但是只要創建線程,就可以設置區域性公開性:
using System;
using System.Globalization;
using System.Threading;
class Program {
static void thread_test() {
Console.WriteLine("Culture: {0}", CultureInfo.CurrentCulture.DisplayName);
}
public static void Main(params string[] args) {
Thread t = new Thread(thread_test);
t.CurrentCulture = new CultureInfo("it-it");
t.Start();
t.Join();
}
}
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.