2009-09-22 7 views
12

Mam sytuację, w której muszę ustawić lokalizację mojego procesu na en-US.Jak zmienić CurrentCulture w całym procesie (nie tylko bieżącym wątku) w .Net?

wiem, jak to zrobić dla bieżącego wątku:

System.Threading.Thread.CurrentThread.CurrentCulture = 
    System.Globalization.CultureInfo.CreateSpecificCulture("en-US"); 

Ale moja aplikacja używa BackgroundWorkers zrobić niektóre przetwarzania, a locale dla tych wątków roboczych wydaje się nie mieć wpływu na powyższą zmianę ich spawning główny wątek.

Jak ustawić ustawienia regionalne dla wszystkich wątków w aplikacji bez ręcznego ustawiania ich w każdym z nich?

Odpowiedz

14

Będziesz musiał zmienić ustawienia regionalne systemu operacyjnego, jeśli chcesz to zrobić. Z jakiego powodu chcesz, aby BackgroundWorkers działały w en-US?

Powinieneś mieć warstwę biznesową działającą w niezmiennej kulturze i mieć tylko określoną kulturę dla interfejsu użytkownika końcowego.

Jeśli używasz komponentu BackgroundWorker, i trzeba to zrobić można spróbować coś takiego w metodzie DoWork:

// In DoWork 
System.Globalization.CultureInfo before = System.Threading.Thread.CurrentThread.CurrentCulture; 
try 

{ 
    System.Threading.Thread.CurrentThread.CurrentCulture = 
     new System.Globalization.CultureInfo("en-US"); 
// Proceed with specific code 
} 

finally 
{ 
    System.Threading.Thread.CurrentThread.CurrentUICulture = before; 
} 
+1

Pracownik tło może być bardzo dobrze działa w warstwie UI (jako składnik BackgroundWorker' '' na Formularzu 'na przykład) –

+0

@ Fredrik- Tak (szczególnie jeśli jest to komponent Background Worker), ale nie aktualizuje się interfejsu użytkownika w wątku procesu roboczego. Przynajmniej nie robisz tego, jeśli używasz go prawidłowo. – RichardOD

+0

Pracownik tła robi podwójny.Parse (ciąg) na niektórych danych wejściowych, który zrywa się dla pewnych ustawień narodowych, które zawierają dziwne znaki dziesiętne. Nadal muszę wiedzieć, jak ustawić ustawienia regionalne dla całego procesu. Mówisz, że to nie jest możliwe? –

0

Używamy klasy pomocnika dla BackgroudWorker tak:

public static class BackgroundWorkerHelper 
{ 
public static void RunInBackground(Action doWorkAction, Action completedAction, CultureInfo cultureInfo) 
    { 
     var worker = new BackgroundWorker(); 
     worker.DoWork += (_, args) => 
     { 
      System.Threading.Thread.CurrentThread.CurrentCulture = cultureInfo; 
      System.Threading.Thread.CurrentThread.CurrentUICulture = cultureInfo; 
      doWorkAction.Invoke(); 
     }; 
     worker.RunWorkerCompleted += (_, args) => 
     { 
      System.Threading.Thread.CurrentThread.CurrentCulture = cultureInfo; 
      System.Threading.Thread.CurrentThread.CurrentUICulture = cultureInfo; 
      completedAction.Invoke(); 
     }; 

     worker.RunWorkerAsync(); 
    } 
} 

Przykład użycia:

BackgroundWorkerHelper.RunInBackground(() => { Work(); },() => { AfterWork(); },Thread.CurrentThread.CurrentCulture); 
1

Użyj tego:

worker.RunWorkerAsync(Thread.CurrentThread.CurrentCulture.LCID);//Pass the LCID as argument 

po dniu zrobić dzieło uczynić to:

Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(int.Parse(e.Argument.ToString())); 
+0

+1 za użycie identyfikatora kultury zamiast nazwy kultury. Jest to konieczne, aby na przykład oddzielić słowo "hiszpański - Hiszpania" od "hiszpański - Hiszpania", gdzie "0x0C0A" używa międzynarodowego porządku sortowania, a "0x040A" używa tradycyjnej kolejności sortowania. REF: [Class CultureInfo] (https://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo%28v=vs.100%29.aspx) – AlwaysLearning

Powiązane problemy