NOTA: El material anticuado, asegúrese de leer la actualización en la parte inferior de los cambios en .NET 4.6
Sí, este es un campo común solicitar pero no está disponible. Windows siempre inicializa un subproceso del sistema operativo al sistema LCID predeterminado, configurado en el subprograma de Opciones regionales y de idioma en el Panel de control. Puede anular esto siempre que cree los hilos usted mismo. Pero eso no es práctico para los subprocesos de subprocesos y subprocesos que podrían haber sido creados por algún tipo de código no administrado ejecutando 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 sobre 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 probabilidad de que dicho hilo ejecute código en su programa, los servidores COM escritos por Microsoft son muy ingeniosos.
Tendrá que revisar su código con un peine de dientes finos y encontrar cualquier código que pueda ejecutarse 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 invalidar la cultura del hilo puede producir muy sutil y difícil de diagnosticar bugz. Un buen ejemplo sería una SortedList que teclea una cadena. Cuando se ejecuta con la cultura incorrecta, al azar no podrá encontrar los elementos que están realmente presentes en la lista. Causado por la lista que ya no se ordena en otra cultura con diferentes reglas de intercalación.
Si logré asustarlo lo suficiente, hice llegar mi mensaje. Esto me pasó a mí, solucionando un problema con un programa muy grande que se comportaba mal en una máquina danesa. No teníamos una localización danesa y obligamos a la IU a funcionar en inglés. Un hilo de trabajo usó un árbol rojo-negro que tenía una cuerda como clave. Falló al azar cuando se le pidió que tratara con Åårdvårks. Me tomó 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 usará para inicializar la cultura de cualquier cadena administrada en lugar de la cultura predeterminada del sistema de Windows.Exactamente cómo interactúa con los hilos que se iniciaron con el código nativo y que ingresan el código administrado aún no está claro 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 de ello. La información proporcionada es aún confusa, experimentalmente también parece fluir a un objeto Thread y no solo a una tarea o subproceso de subprocesos y DefaultThreadCurrentCulture no se utiliza. Dos pasos hacia adelante, un paso atrás, se recomiendan las pruebas.