2010-02-10 9 views
21

Mam aplikacji napisane w języku C#, który nie ma GUI lub interfejsu użytkownika, ale zamiast tego zapisuje pliki, które są analizowane przez inną aplikację (w XML i innych).Czy jest możliwe ustawienie CultureInfo dla aplikacji .NET lub tylko wątku?

Mam klienta, którego CultureInfo ma NumberDecimalSeparator ustawiony na przecinek, co powoduje błędy parsowania z liczb zmiennoprzecinkowych (PI kończy się jako 3,1415).

Chciałbym uzyskać sposób, aby ustawić CultureInfo globalnie w aplikacji, dla wszystkich wątków. Próbowałem:

  1. The (podobno) zwyczajowe podejście ustawiania CurrentThread.CurrentCulture jako pierwsza linia w main() ale wydaje się, aby zresetować.
  2. Zmiana/rozszerzenie na http://www.codeproject.com/KB/cs/Change_App_Culture.aspx
  3. Wykonaj to samo (# 1) na jawnie utworzonych wątkach w aplikacji.

Zmiana na formatowanie jawne nie jest opcją (150K + linie, większość napisana przez byłych pracowników).

[Edytuj] Aplikacja łączy się z gniazdem i obsługuje żądania od dedykowanych klientów. W zależności od typu żądania tworzy różne klasy obsługi.

Przepraszam, kiedy po raz pierwszy opublikowałem, powinienem był wyjaśnić w # 1, że (I though) Zrobiłem to we wszystkich procedurach, które zostały jawnie odrodzone.

Okazuje się, że przegapiłem wątek/uchwyt, który był przyczyną problemu. Aplikacja działa teraz prawidłowo, ale pozostaje pytanie, czy można ustawić kulturę we wszystkich wątkach.

Gdyby można było powtórzyć wszystkie wątki, rozwiąże to również problem. Więc:

Jak mogę uzyskać wszystkie wątku przedmiotów (nie ProcessThread) w bieżącym procesie?

Odpowiedz

13

Niestety, każdy nowy wątek zaczyna się od systemu informacji locale , nawet jeśli zaczyna się od wątku, którego lokalizacja zmieniła się na coś innego.

To była ogromna robota, na którą natknąłem się w jednej z naszych aplikacji, gdy używano pliku BackgroundWorker do załadowania pliku.

Podejście, którego użyłem z powodzeniem, to ustawienie locale w wątku startowym, a następnie użycie fabryki nici do tworzenia wątków z "lokalizacją aplikacji". Dla BackgroundWorkers można użyć klasy fabrycznej lub pochodnej, ponieważ Thread jest zaplombowany, podczas gdy BackgroundWorker nie jest.

+6

Pomaga tylko jeśli jesteś w kontroli tworzenia wątku. Czasami masz do czynienia z wątkami stworzonymi przez .NET. Nie należy nigdy zapominać o świętej linii ** 'System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo (" EN-US ");' ** – Bitterblue

6

Nie sądzę, można ustawić kultury dla całej aplikacji, ale można ustawić osobiĹ kultury podczas tworzenia wątek:

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

W .NET 4.5 można użyć CultureInfo.DefaultThreadCurrentCulture

Powiązane problemy