2010-02-10 98 views
21

我用C#編寫的應用程序沒有GUI或UI,而是寫入由另一個應用程序(以XML和其他應用程序)解析的文件。是否可以爲.NET應用程序或只是一個線程設置CultureInfo?

我有一位客戶,其CultureInfo將NumberDecimalSeparator設置爲逗號,這會導致浮點數字的分析錯誤(PI最終會變爲3,1415)。

我想要一種方法來在應用程序中爲所有線程全局設置CultureInfo。我已經試過:

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

而改爲使用顯式格式不是一種選擇(150K +行,大部分由前員工編寫)。

[編輯] 該應用程序綁定到套接字並處理來自專用客戶端的請求。根據請求類型,它產生不同的處理程序類。

對不起,當我第一次發佈時,我應該在#1中澄清,(我雖然)我已經在所有明確產生的處理程序中完成了此操作。

事實證明,我錯過了導致問題的線程/處理程序。因此,應用程序現在正常工作,但問題仍然存在,如果文化可以在所有線程上設置。

如果它可以迭代所有線程,它也可以解決問題。所以:

我怎樣才能在當前進程得到所有主題對象(不ProcessThread)?

回答

13

不幸的是,每一個新的線程與系統區域設置信息來啓動即使它是從其語言環境更改爲其他語言的線程開始的。

這是我在使用BackgroundWorker加載文件時遇到的一個巨大問題。

我成功使用的方法是在啓動線程上設置語言環境,然後使用線程工廠創建具有「應用程序語言環境」的線程。對於BackgroundWorkers,您可以使用工廠或派生類,因爲Thread是密封的,而BackgroundWorker則不是。

+6

幫助僅當您在創建線程的控制是。有時你必須處理由.NET創建的線程。人們不應該忘記聖行**'System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(「EN-US」); ** – Bitterblue 2014-02-07 12:34:30

6

我不認爲你可以設置文化爲整個應用程序,但每當你創建一個線程可以設置文化explicilty:

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(); 
    } 
} 
3

Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");

26

在.NET 4.5,你可以使用CultureInfo.DefaultThreadCurrentCulture

相關問題