with threads threading thread multi example espaƱol book c# multithreading culture

threads - task c#



C#fondo cultura del trabajador (6)

Me gustaría establecer la cultura para toda mi aplicación. Intenté lo siguiente:

Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(wantedCulture); Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(wantedCulture); Application.CurrentCulture = CultureInfo.CreateSpecificCulture(wantedCulture);

Funciona para el subproceso actual, pero luego creo y comienzo un subproceso de trabajo en segundo plano. Cuando creo el trabajador, el subproceso actual se ejecuta con wantedCulture, pero el subproceso de trabajo se ejecuta con la cultura de mi computadora.

¿Alguna idea para establecer la cultura para toda la aplicación?


Windows siempre inicializa un subproceso del sistema operativo al LCID predeterminado del sistema, configurado en el applet Regional y Opciones de idioma en el Panel de control.

Lamentablemente tengo que estar en desacuerdo con esto y he encontrado lo contrario.

El sistema se instaló como inglés estadounidense. El panel de control se cambió a danés y se copió en todas las cuentas. Reiniciado

Ejecutar la aplicación de la consola se ejecuta en danés. Ejecutar aplicación web pregunta navegador dice en danés. Lance el hilo desde la aplicación web y se lanzó como US no danés y no puedo entender por qué.


Mi solución fue tener una propiedad de cultura central (Application.CurrentCulture es por subproceso) y establecer la cultura de subprocesos actual a esto al comienzo de un subproceso de trabajo. Un sistema de trabajo ayuda con esto, ya que luego puede ejecutar fácilmente un código genérico antes y después del elemento de trabajo, y la clase de sistema de trabajo puede mantener la cultura accesible para sus trabajos, por lo que no necesita globales.


NOTA: material fechado, asegúrese de leer la Actualización en la parte inferior para los cambios en .NET 4.6

Sí, esta es una solicitud común pero no está disponible. Windows siempre inicializa un subproceso del sistema operativo al LCID predeterminado del sistema, configurado en el applet Regional y Opciones de idioma en el Panel de control. Puede anular esto siempre y cuando cree los subprocesos usted mismo. Pero eso no es práctico para los subprocesos de subprocesos de subprocesos y los subprocesos que pueden haber sido creados por algún tipo de código no administrado que ejecuta su proceso, como un servidor COM.

El último caso es el problema. .NET no tiene problemas para ejecutar código administrado en subprocesos creados por código no administrado. Pero no puede hacer nada respecto a la forma en que se inicializa el hilo. Eso es cierto para CurrentUICulture pero también para cosas más oscuras como Thread.SetApartmentState (). No subestime la posibilidad de que un subproceso de este tipo ejecute código en su programa, los servidores COM escritos por Microsoft están muy contentos.

Tendrá que verter su código con un peine de dientes finos y encontrar cualquier código que pueda correr en un hilo que no haya creado. Cualquier controlador de eventos es sospechoso, al igual que cualquier método BeginXxx () que tenga una devolución de llamada. BackgroundWorker es definitivamente el problema menor.

No anular la cultura del hilo puede producir errores muy difíciles de diagnosticar. Un buen ejemplo sería una lista ordenada que teclea una cadena. Cuando se ejecuta con la cultura incorrecta, no podrá encontrar elementos que realmente estén presentes en la lista. Causado porque la lista ya no se clasifica en otra cultura con diferentes reglas de intercalación.

Si logré asustarte lo suficiente, entonces recibí mi mensaje. Esto me pasó a mí, depurando un problema con un programa muy grande que se comportaba mal en una máquina danesa. No teníamos una localización danesa y forzamos a la interfaz de usuario a ejecutarse en inglés. Un subproceso de trabajo usó un árbol rojo-negro que tenía una cadena como clave. Falló aleatoriamente cuando se le pidió que tratara con Åårdvårks. Me llevó una semana.

Actualización: este problema se ha solucionado en .NET 4.5. La clase CultureInfo ahora tiene un DefaultThreadCurrentCulture y DefaultThreadCurrentUICulture. Cuando se establece, se utilizará para inicializar la cultura de cualquier subproceso administrado en lugar de la cultura del sistema de Windows predeterminada. La forma exacta en que interactúa con los subprocesos que comenzaron con el código nativo y el código administrado aún no está clara para mí.

Actualización: este problema tenía una solución más completa en .NET 4.6. La cultura ahora fluye automáticamente, el comportamiento ideal. El artículo de MSDN para CultureInfo.CurrentCulture() habla sobre ello. La información proporcionada todavía es confusa, experimentalmente también parece fluir a un objeto Thread y no solo a un hilo Taskpool o threadpool y DefaultThreadCurrentCulture no se usa. Dos pasos adelante, un paso atrás, se recomienda la prueba.


No puedes hacer esto por cada hilo creado recientemente. Debería hacerlo a mano (pero no creo que establecer una cultura de subprocesos de grupo de subprocesos sea una buena idea). Tal vez su aplicación deba depender de Application.CurrentCulture o alguna otra cosa global ...


Sé que el tema es antiguo pero me encontré en un problema de "hilo con la cultura del sistema operativo".

Lo resolví así: ya que BackgroundWorker está en un UserControl (sería válido si está en un Formulario y así sucesivamente ...) Establecí un campo en el UserControl (o Formulario) cuando se construye. En el controlador de eventos DoWork, uso este campo en mis operaciones. Aquí el código:

/// <summary> /// Culture in which the GUI creates the control. /// </summary> private readonly CultureInfo _currentCulture; /// <summary> /// Default constructor. /// </summary> public MyControl() { InitializeComponent(); _currentCulture = CultureInfo.CurrentUICulture; } private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e) { ExampleClass.DoCultureDependentOperation(_currentCulture); }


Simplemente pon; No lo hagas

No haga ningún formato específico de cultura en ningún otro hilo que no sea el hilo principal ( Thread.CurrentThread ). Obtener la cultura correcta en otros subprocesos, todos los demás subprocesos creados, es solo una molestia y, tarde o temprano, olvidará configurarlo correctamente. Es mejor simplemente evitar el dolor todos juntos y solo hacer el formato, conversión, etc. específico de la cultura en el hilo que está garantizado para estar en la configuración de la cultura correcta.