簡體   English   中英

是否可以為.NET應用程序或僅為線程設置CultureInfo?

[英]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的方法。 我試過了:

  1. (顯然)將CurrentThread.CurrentCulture設置為Main()的第一行的慣用方法,但似乎被重置了。
  2. http://www.codeproject.com/KB/cs/Change_App_Culture.aspx的變體/擴展
  3. 對應用程序中顯式創建的線程執行相同的操作(#1)。

更改為使用顯式格式不是一個選擇(超過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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM