2009-09-22 6 views
12

Ho una situazione in cui ho bisogno di impostare il mio processo 'locale in en-US.Come posso modificare CurrentCulture dell'intero processo (non solo il thread corrente) in .Net?

so come fare questo per il thread corrente:

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

Ma la mia applicazione utilizza BackgroundWorkers a fare un po 'di elaborazione, e il locale per questi thread di lavoro sembra non risentire della modifica sopra alla loro spawning main-thread.

Quindi, come posso impostare le impostazioni internazionali per tutti i thread nella mia applicazione senza impostarla manualmente in ciascuna di esse?

risposta

14

È necessario modificare le impostazioni internazionali del sistema operativo se si desidera farlo. Per quale motivo vuoi che BackgroundWorkers funzioni in en-US?

Si dovrebbe avere il livello aziendale in esecuzione in una cultura invariabile e solo una cultura specifica per l'interfaccia utente dell'utente finale.

Se si utilizza il componente BackgroundWorker, e devi fare questo si potrebbe provare qualcosa di simile nel metodo 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

Il lavoratore sfondo può benissimo essere in esecuzione nello strato UI (come componente 'BackgroundWorker' su un' modulo 'ad esempio) –

+0

@ Fredrik- Sì (soprattutto se è il componente Background Worker), ma non si aggiorna l'interfaccia utente sul thread di lavoro in background. Almeno non lo fai se lo stai usando correttamente. – RichardOD

+0

L'operatore in background esegue double.Parse (stringa) su un input, che si interrompe per alcune impostazioni locali con rappresentazioni di punti decimali. Quindi, ho ancora bisogno di sapere come impostare le impostazioni internazionali per l'intero processo. Stai dicendo che questo non è possibile? –

0

Usiamo classe helper per BackgroudWorker come questo:

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

Esempio di utilizzo:

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

Utilizzare questa:

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

dopo il fare il lavoro rendono questo:

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

+1 per l'utilizzo di un identificatore di cultura anziché di un nome di coltura. Questo è necessario per separare 'Spagnolo - Spagna' da' Spagnolo - Spagna', ad esempio, dove '0x0C0A' usa un ordinamento internazionale e' 0x040A' usa il tradizionale ordinamento. RIF: [CultureInfo Class] (https://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo%28v=vs.100%29.aspx) – AlwaysLearning

Problemi correlati