ámbito usuario sistema configuración con app admite actual c# .net performance configuration properties

c# - usuario - Preocupaciones de rendimiento de ConfigurationManager.AppSettings



properties.settings.default c# (8)

¿Podría preguntar por qué no está guardando la configuración del usuario en una base de datos?

Generalmente, guardo la configuración de la aplicación que se cambia con poca frecuencia en la sección appSettings (a la que se envían los registros de error predeterminados de la dirección de correo electrónico, la cantidad de minutos después de los cuales se cierra sesión automáticamente, etc.) El alcance de esto realmente está en la aplicación , no en el usuario, y generalmente se utiliza para la configuración de implementación.

Planeo guardar todas mis configuraciones en la sección app.config de mi aplicación (usando la clase ConfigurationManager.AppSettings). A medida que el usuario cambia la configuración mediante la IU de la aplicación (haciendo clic en casillas de verificación, seleccionando botones de opción, etc.), planeo escribir esos cambios en AppSettings. Al mismo tiempo, mientras el programa se está ejecutando, planeo tener acceso constantemente a AppSettings desde un proceso que procesará datos constantemente. Los cambios en la configuración a través de la interfaz de usuario deben afectar el procesamiento de datos en tiempo real, por lo que el proceso accederá constantemente a AppSettings.

¿Es esta una buena idea con respecto al rendimiento? Se supone que el uso de AppSettings es "la forma correcta" de almacenar y acceder a los ajustes de configuración cuando se escriben aplicaciones .Net, pero me preocupa que este método no esté destinado a una carga constante (al menos en términos de configuración que se lee constantemente).

Si alguien tiene experiencia con esto, agradecería mucho la entrada.

Actualización: probablemente debería aclarar algunos puntos.

Esta no es una aplicación web, por lo que conectar una base de datos a la aplicación puede ser excesiva simplemente para almacenar la configuración. Esta es una aplicación de Windows Forms.

De acuerdo con la documentación de MSDN, ConfigurationManager es para almacenar no solo la configuración del nivel de la aplicación, sino también la configuración del usuario. (Especialmente importante si, por ejemplo, la aplicación se instala como una aplicación de confianza parcial).

Actualización 2: acepté la respuesta de lomaxx porque Properties realmente parece una buena solución, sin tener que agregar capas adicionales a mi aplicación (como una base de datos). Al usar Propiedades, ya hace todo el almacenamiento en caché que otros sugirieron. Esto significa que todos los cambios y lecturas posteriores se realizan en la memoria, lo que lo hace extremadamente rápido. Propiedades solo escribe los cambios en el disco cuando se lo indica explícitamente. Esto significa que puedo hacer cambios en la configuración de configuración sobre la marcha en tiempo de ejecución y luego solo realizar un último guardado en el disco cuando el programa sale.

Solo para verificar que realmente sería capaz de manejar la carga que necesito, realicé algunas pruebas en mi computadora portátil y pude hacer 750,000 lecturas y 7,500 escrituras por segundo usando Propiedades. Eso está muy por encima y más allá de lo que mi aplicación se acercará a necesitar, por lo que me siento bastante seguro al usar propiedades sin afectar el rendimiento.


Alguien me corrige si me equivoco, pero no creo que AppSettings esté destinado a ser utilizado para este tipo de configuración. Normalmente, solo debe establecer configuraciones que permanezcan bastante estáticas (cadenas de conexión de bases de datos, rutas de archivos, etc.). Si desea almacenar configuraciones de usuario personalizables, sería mejor crear un archivo de preferencias separado, o idealmente almacenar esas configuraciones en una base de datos.


AppSettings no está diseñado para lo que estás tratando de hacer.

Cuando se inicia su aplicación .NET, se lee en el archivo app.config y almacena su contenido en la memoria caché. Por esa razón, después de escribir en el archivo app.config, tendrá que forzar de algún modo al motor de ejecución a volver a analizar el archivo app.config para que pueda almacenar en caché la configuración nuevamente. Esto es innecesario

El mejor enfoque sería usar una base de datos para almacenar sus configuraciones.

Exceptuando el uso de una base de datos, puede configurar fácilmente un archivo de configuración XML externo. Cuando se inicia la aplicación, puede almacenar sus contenidos en un objeto NameValueCollection o HashTable. Al cambiar / agregar configuraciones, lo haría a esa copia en caché. Cuando su aplicación se apaga, o en un intervalo de tiempo apropiado, puede volver a escribir el contenido de la caché en un archivo.


Dylan,

No use el archivo de configuración de la aplicación para este propósito, use un SQL DB (SQLite, MySQL, MSSQL, lo que sea) porque tendrá que preocuparse menos por los problemas de concurrencia durante las lecturas y escrituras en el archivo de configuración.

También tendrá una mejor flexibilidad en el tipo de datos que desea almacenar. La sección de configuración de la aplicación es solo una lista de clave / valor que puede superar a medida que pasa el tiempo y a medida que la aplicación madura. Puede usar secciones de configuración personalizadas, pero luego se encuentra en una nueva área problemática cuando se trata del diseño.


Mira SQLite, parece una buena opción para este escenario en particular.


No usaría archivos de configuración para almacenar datos de usuario. Use un db.


Una cosa que me gustaría hacer es almacenar en caché las aplicaciones en una lectura, luego lavar las configuraciones de la memoria caché en la escritura, lo que debería minimizar la cantidad de carga real que el servidor tiene que manejar para procesar la configuración de la aplicación.

Además, si es posible, consulte cómo dividir la configuración de la aplicación en configSections para que pueda leer las configuraciones relacionadas de escritura y caché.

Habiendo dicho todo eso, seriamente consideraría almacenar estos valores en una base de datos ya que parece que realmente está almacenando las preferencias del usuario y no la configuración de la aplicación.


ya que está utilizando una aplicación de winforms, si está en .net 2.0, en realidad hay un sistema de configuración de usuario (llamado Propiedades) diseñado para este propósito. Este artículo en MSDN tiene una muy buena introducción a este

Si todavía le preocupa el rendimiento, eche un vistazo a SQL Compact Edition, que es similar a SQLite, pero la oferta de Microsoft que he encontrado funciona muy bien con winforms e incluso hay la posibilidad de hacerlo funcionar con Linq