¿Es posible establecer el CultureInfo para an.NET aplicación o simplemente un hilo?


Tengo una aplicación escrita en C# que no tiene GUI o UI, sino que escribe archivos que son analizados por otra aplicación (en XML y otros).

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

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

  1. La (aparentemente) costumbre enfoque de ajuste currentThread.CurrentCulture como la primera línea en Main() pero parece que se restablece.
  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 explícitamente creados en la aplicación.

Y cambiar para usar formato explícito no es una opción (más de 150K líneas, la mayoría escritas por antiguos empleados).

[Editar] La aplicación se une a una socket y maneja las solicitudes de clientes dedicados. Dependiendo del tipo de solicitud, genera diferentes clases de manejador.

Lo siento, cuando publiqué por primera vez debería haber aclarado en #1 que ( Pensé) había hecho esto en todos los controladores que se generaron explícitamente, también.

Resulta que me perdí el hilo / controlador que estaba causando el problema. Así que la aplicación está funcionando correctamente ahora, pero la pregunta sigue siendo si la cultura se puede establecer en todos hilo.

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

¿Cómo puedo obtener todos los objetos Thread (no ProcessThread ) en el proceso actual?

Author: NVRAM, 2010-02-10

4 answers

Desafortunadamente, cada hilo nuevo comienza con información de la configuración regional del sistema, incluso si se inicia desde un hilo que ha cambiado su configuración regional a otra cosa.

Este fue un gran gotcha me encontré en una de nuestras aplicaciones cuando se utiliza 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 los trabajadores de fondo se puede utilizar ya sea una fábrica o un derivado clase, ya que Thread está sellado mientras que BackgroundWorker no lo está.

 14
Author: Jon Seigel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-11 20:42:21

En.NET 4.5 puede utilizar CultureInfo.DefaultThreadCurrentCulture

 30
Author: BPeter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-02 12:46:29

No creo que se pueda establecer la cultura para toda la aplicación, pero se puede establecer la cultura explicity cada vez que se crea 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();
    }
}
 6
Author: Paolo Tedesco,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-10 08:40:38

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

 4
Author: friuns,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-20 11:26:12