2009-04-13 11 views
9

¿Existe un método sencillo de acceder a los datos de configuración personalizados basados ​​en configuración del sistema mediante una interfaz segura para subprocesos sin que cada contexto de ejecución cargue o vuelva a cargar información de configuración que sería computacionalmente onerosa?Uso seguro de subprocesos de System.Configuration

clases System.Configuration, como la mayoría (todos?) Otras clases de documentación de la biblioteca .Net de Microsoft, se anotan los siguientes datos hilo de seguridad:

estáticos públicos (Shared en Visual Basic) de este tipo son seguros para subprocesos. No se garantiza que ningún miembro de instancia sea seguro para subprocesos.

Por mi lectura de esto, los ConfigurationSection objetos devueltos desde las ConfigurationManager.GetSection(string) y otros métodos similares (por ejemplo OpenExeConfiguration(string exePath).GetSection(string)) no debe suponerse que ser seguro para subprocesos y por lo tanto no debe ser usado por múltiples contextos de ejecución. Esto prohíbe almacenar un ConfigurationSection en un singleton que, de lo contrario, sería seguro para subprocesos porque, aunque el acceso al objeto de sección puede ser seguro, los miembros del objeto en sí no son seguros.

Sin embargo, es probable que varias llamadas al GetSection requieran un nuevo análisis de los archivos de configuración y la asignación de nuevas instancias ConfigurationSection que tienen una sobrecarga alta considerando que es probable que la configuración nunca cambie después de la inicialización. Además, copiar los datos de configuración en otro objeto que se ha hecho seguro para subprocesos parece frustrar uno de los principales beneficios del uso del paquete de configuración integrado en primer lugar (fácil acceso a la información de configuración validada y convertida tipo sin mucha repetición código).

Entonces, ¿hay alguna manera de usar System.Configuration de manera segura sin recurrir a análisis excesivos y asignaciones de secciones de configuración? ¿La implementación de su propio ConfigurationSection lo libera de la falta de garantía proporcionada por Microsoft aunque está accediendo a través de las interfaces System.Configuration (y si es así, cómo lo implementaría para que sea seguro para subprocesos cuando se accede al indexador base ConfigurationSection? es necesario para acceder a los datos configurados)?

Respuesta

5

La instancia devuelta por GetSection no es segura para subprocesos. Eso significa que necesita agregar código de bloqueo para usarlo en su singleton.

Las llamadas múltiples no vuelven a analizar el archivo, a menos que el archivo haya cambiado. Los datos están en caché en la memoria.

Su problema de seguridad de subprocesos se resuelve fácilmente mediante el bloqueo (no estoy seguro de que sea necesario, a menos que esté cambiando la configuración en tiempo de ejecución), y no hay ningún problema de rendimiento.

+0

He estado teniendo un servidor IIS al azar durante los últimos 5 meses debido a esto. No tenía idea de por qué (el bloqueo era un desbordamiento de pila en MSCorLib) hasta que sucedió en mi máquina de desarrollo, y una llamada de aplicación lo había provocado. Creo que esto responde mi pregunta. Gracias. –

0

ConfigurationManager.GetSection (string) es un miembro público estático, y como estados de msdn 'Cualquier elemento estático público (Compartido en Visual Basic) de este tipo es seguro para subprocesos', puede suponer que es seguro de usar.

En cuanto al rendimiento, estoy dispuesto a suponer que MS ya lo ha hecho bastante eficiente y solo uso sus funciones tal como están. Recuerde: la optimización prematura es la raíz del mal.

Cuestiones relacionadas