Pregunta

Tengo una aplicación escrita en C # que no tiene interfaz gráfica de usuario o la interfaz de usuario, sino que escribe los archivos que se analizan por otra aplicación (en XML y otros).

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

Me gustaría tener una manera de establecer el CultureInfo a nivel mundial 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 las roscas creadas de forma explícita en la aplicación.

Y cambiando a utilizar el formato explícito no es una opción (150K + líneas, la mayoría escritos por ex-empleados).

[Editar] La aplicación se une a una toma de corriente y gestiona las peticiones de los clientes dedicados. Dependiendo del tipo de solicitud que 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 hilo / controlador que estaba causando el problema. Así que la aplicación funciona correctamente, pero la pregunta sigue siendo sobre si la cultura se puede ajustar en todas las roscas.

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

¿Cómo puedo obtener toda Tema objetos (no ProcessThread ) en el proceso actual?

¿Fue útil?

Solución

Por desgracia, cada nuevo hilo comienza con el sistema de información de localización, incluso si se partía de un hilo que ha tenido su escenario cambió a otra cosa.

Este fue un gran Gotcha me encontré en una de las aplicaciones cuando se utiliza un BackgroundWorker para cargar un archivo.

El enfoque que he usado con éxito es establecer la configuración regional en el hilo de arranque y, a continuación, utilizar una fábrica de hilos para crear discusiones con el "regional de la aplicación." Para BackgroundWorkers puede utilizar ya sea una fábrica o una clase derivada, como Thread se sella mientras BackgroundWorker no lo es.

Otros consejos

En .NET 4.5 se puede utilizar CultureInfo.DefaultThreadCurrentCulture

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

Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top