2009-09-22 38 views
12

Tengo una situación en la que necesito establecer la configuración regional de mi proceso en Estados Unidos.¿Cómo puedo cambiar la CurrentCulture de todo el proceso (no solo el hilo actual) en .Net?

sé cómo hacer esto para el subproceso actual:

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

Pero mi aplicación utiliza BackgroundWorkers a hacer algo de procesamiento, y el escenario para estos subprocesos de trabajo no parece ser afectada por el cambio anterior a su hilo principal de desove.

Entonces, ¿cómo puedo establecer la configuración regional para todos los hilos en mi aplicación sin configurarla en cada uno manualmente?

Respuesta

14

Tendrás que cambiar la configuración regional del sistema operativo si quieres hacerlo. ¿Por qué razón quieres que BackgroundWorkers se ejecute en Estados Unidos?

Debe tener su capa empresarial ejecutándose en una cultura invariable, y solo debe tener una cultura específica para la IU del usuario final.

Si está utilizando el componente BackgroundWorker, y tiene que hacer esto usted podría intentar algo como esto en el método 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

El trabajador fondo puede muy bien estar en ejecución en la capa de interfaz de usuario (como un componente '' BackgroundWorker' en un Formulario 'por ejemplo) –

+0

@ Fredrik- Sí (especialmente si es el componente Trabajador en segundo plano), pero no actualiza la IU en el hilo de trabajo en segundo plano. Al menos no lo haces si lo estás usando correctamente. – RichardOD

+0

El trabajador en segundo plano hace double.Parse (string) en alguna entrada, que se rompe para ciertas configuraciones regionales que tienen representaciones de punto decimal extrañas. Entonces, todavía necesito saber cómo configurar la configuración regional para todo el proceso. ¿Estás diciendo que esto no es posible? –

0

Utilizamos clase de ayuda para BackgroudWorker así:

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

Uso del ejemplo:

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

Utilice esta:

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

después de hacer el trabajo de hacer esto:

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

+1 para usar un identificador de cultura en lugar de un nombre de cultura. Esto es necesario para separar 'español - España' de' español - España', por ejemplo, donde '0x0C0A' usa un orden internacional y' 0x040A' utiliza un orden de clasificación tradicional. REF: [Clase CultureInfo] (https://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo%28v=vs.100%29.aspx) – AlwaysLearning

Cuestiones relacionadas