Estoy creando un servicio de Windows que ejecuta varios subprocesos. ¿Puedo establecer la cultura de mi appDomain completo, en lugar de configurarlo para cada hilo por separado?Definir la cultura para todo el dominio de aplicación
Respuesta
Esto no es posible. Los subprocesos obtienen su referencia predeterminada cuando Windows crea el subproceso, inicializado desde la configuración regional predeterminada del sistema tal como se configuró en el Panel de control + Región e idioma. Las funciones pertinentes de la API de Win32 son Get/SetThreadLocale().
No hay ningún mecanismo en el CLR para imbuir un hilo con otro valor predeterminado. Un escenario común para un hilo es comenzar la vida creada por un código no administrado y ejecutar gran cantidad de ese código no administrado, haciendo ocasionalmente una devolución de llamada en el código administrado. Ese código administrado se ejecutará con Thread.CurrentCulture establecido en la cultura seleccionada por el código no administrado. O el valor predeterminado de Windows si el código no administrado no llamó a SetThreadLocale(). Tener el CLR modificado causaría una falla no diagnosticable en el código no administrado.
Por supuesto, puede anularlo explícitamente pero es difícil hacerlo bien. Los sutiles errores de formato son fáciles de ver, se vuelve difícil cuando se usan, por ejemplo, las estructuras de datos que implícitamente dependen de los órdenes de clasificación de la cadena. Una SortedList de repente no puede encontrar un elemento en la lista que está realmente presente. También es difícil controlarlo, muchas devoluciones de subprocesos de subprocesos de subprocesos en todo el marco de .NET.
No pierda el tiempo con esto para evitar caer en trampas como estas, ya sea que confíe en el sistema predeterminado o aplique CultureInfo explícitamente.
ACTUALIZACIÓN: como se ha señalado por Thomas, una solución estará disponible en .NET 4.5, tiene una nueva propiedad de la clase CultureInfo para establecer la cultura por defecto del dominio de aplicación. MSDN docs are here. La interacción exacta con subprocesos no administrados que ingresan código administrado no está muy clara en la documentación, asegúrese de verificar esto si alguna vez permite que el código nativo realice devoluciones de llamada, como a través de pinvoke, Marshal.GetFunctionPointerForDelegate() o el evento de un objeto COM.
Update2: esto se cambió de nuevo en .NET 4.6, la cultura ahora fluye de un hilo a otro de modo que los modos de fallo peores son atendidos. Lea los detalles al respecto en el artículo de MSDN para CultureInfo.CurrentCulture. Debes dirigirte explícitamente a 4.6 para obtener el beneficio.
Usted podría tener un método personalizado que va a disparar las discusiones y la cultura ajustar automáticamente:
static bool StartThread(WaitCallback callback, object state)
{
return ThreadPool.QueueUserWorkItem(s =>
{
// Set the culture
Thread.CurrentThread.CurrentCulture = new CultureInfo("es-ES");
// invoke the callback
callback(s);
}, state);
}
Y cuando se necesita para iniciar un nuevo hilo simplemente utilizar este método:
StartThread(state => { /** Do some processing on a new thread **/ }, null);
solución bonito ... pero no alcanzará la meta - Necesito algo que va a establecer la cultura, incluso cuando me olvido de configurarlo. Lo mismo puede suceder aquí si olvido iniciar el hilo a través del método 'StartThread'. Quiero que todos los hilos hereden su cultura automáticamente – Nissim
Exactamente. ¿Puedes mostrarme el fragmento para hacer esto? – Nissim
Para los cultivos de dominio de aplicación 4.5 por defecto se podría establecer a través de CultureInfo
clase:
Esta es la nueva respuesta correcta. – Gleno
- 1. Redirigir todo el tráfico a la raíz de otro dominio
- 2. Cómo controlar Copiar, Pegar, Seleccionar todo, Definir en la aplicación UITextView para iPhone?
- 3. Dónde definir el número de versión de la aplicación Rails
- 4. No se han encontrado recursos apropiados para la cultura especificada o la cultura neutral
- 5. No se han encontrado recursos para la cultura especificada o la cultura neutral
- 6. Cambiar la cultura DateTimePicker para .Net especialmente el calendario persa
- 7. C# Cultura de BackgroundWorker
- 8. ¿Cómo puedo forzar la Cultura de localización a EE.UU. para toda la aplicación?
- 9. C# float.tryparse para cultura francesa
- 10. .NET - Obtenga el nombre de la cultura del código de cultura
- 11. No se admite el nombre de cultura
- 12. Cómo reenviar el dominio descubierto a www.dominio para el sitio alojado en la aplicación Google
- 13. Obtener la moneda de la cultura actual?
- 14. ¿Qué es la cultura invariante?
- 15. Impersonación de nivel de dominio de aplicación
- 16. Usando spring: mensaje para definir el atributo de etiqueta de formulario en la aplicación web Spring
- 17. ¿Cómo se establece una cookie para ser accesible en todo el dominio en Javascript
- 18. AppDomain Unload killing Parent Dominio de aplicación
- 19. Cómo determinar la vida del dominio de aplicación ASP.NET
- 20. ¿La interoperabilidad COM respeta los límites del Dominio de aplicación .NET para la carga de ensamblaje?
- 21. ¿Dónde debo almacenar la configuración de configuración de todo el sitio para una aplicación de Rails?
- 22. Significado de la infraestructura y el código de aplicación en el diseño de dominio impulsada
- 23. CPU y tapa de memoria para un dominio de aplicación
- 24. C# ¿Cómo puedo forzar la Cultura de localización a en-US para el proyecto de pruebas
- 25. Cultura personalizada para verbosidad específica del cliente?
- 26. Uso dominio de aplicación para cargar/descargar ensamblados externos
- 27. Se puede configurar nunit para eliminar el dominio de la aplicación por dispositivo (o por prueba)
- 28. ¿Cómo puedo obtener LINQ para ordenar según la cultura?
- 29. ¿Hay un dominio de aplicación para cada programa C#?
- 30. ¿Cómo usar etiquetas TODO en org-mode sin definir encabezados?
Según [esta página] (http://msdn.microsoft.com/en-us/library/ms171868%28v=vs.110%29.aspx), será posible en .NET 4.5: "Capacidad de definir la cultura para un dominio de aplicación". Sin embargo, no encontré cómo hacerlo ... No puedo ver ninguna propiedad relevante en AppDomain o AppDomainSetup –
@Thomas: ver Valdis '[respuesta] (http://stackoverflow.com/a/8030336/107604) abajo. –