2010-02-10 10 views
21

Tengo una aplicación escrita en C# que no tiene GUI o UI, pero en su lugar escribe archivos que son analizados por otra aplicación (en XML y otros).¿Es posible establecer CultureInfo para una aplicación .NET o solo un hilo?

Tengo un cliente cuyo CultureInfo tiene el separador NumberDecimalSeparador en una coma, lo que provoca errores de análisis con números de coma flotante (PI terminaría como 3,1415).

Me gustaría una forma de establecer CultureInfo globalmente dentro de la aplicación, para todos los hilos. He intentado:

  1. El (aparentemente) el enfoque habitual de establecer CurrentThread.CurrentCulture como la primera línea en Principal() pero parece que se restablezca.
  2. Una variación/expansión en http://www.codeproject.com/KB/cs/Change_App_Culture.aspx
  3. Haga lo mismo (# 1) en los subprocesos creados explícitamente en la aplicación.

Y cambiar para usar el formato explícito no es una opción (150K + líneas, la mayoría escritas por ex empleados).

[Editar] La aplicación se une a una toma de corriente y gestiona las peticiones de los clientes dedicados. Según el tipo de solicitud, genera diferentes clases de controlador.

En este momento, cuando por primera vez yo debería haber aclarado en el # 1 que (I aunque) que había hecho esto en todos los controladores que fueron generados de forma explícita, también.

Resulta que me perdí el subproceso/controlador que causaba el problema. Entonces, la aplicación funciona correctamente ahora, pero la pregunta sigue siendo si la cultura se puede configurar en todos los hilos.

Si pudiera iterar sobre todos los hilos, también resolvería el problema. Por lo tanto:

¿Cómo puedo conseguir todos los objetos de rosca (no ProcessThread) en el proceso actual?

Respuesta

13

Por desgracia, cada nuevo hilo comienza con el sistema de información de configuración regional , incluso si se inició a partir de un hilo que cambió su configuración regional a otra cosa.

Esto fue una gran cantidad que encontré en una de nuestras aplicaciones cuando usé un BackgroundWorker para cargar un archivo.

El enfoque que he utilizado con éxito es establecer la configuración regional en el subproceso de inicio y luego usar una fábrica de subprocesos para crear subprocesos con la "configuración regional de la aplicación". Para BackgroundWorkers puede usar una clase de fábrica o derivada, ya que Thread está sellado mientras que BackgroundWorker no.

+6

Ayuda sólo si usted está en control de la creación del hilo. A veces tienes que tratar con hilos creados por .NET. Uno nunca debería olvidar la línea sagrada ** 'System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo (" EN-US ");' ** – Bitterblue

6

No creo que se puede establecer la cultura para toda la aplicación, pero se puede establecer el explicilty cultura cada vez que cree un hilo:

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

En .NET 4.5 se puede utilizar CultureInfo.DefaultThreadCurrentCulture

Cuestiones relacionadas