Pergunta

Pretendo armazenar todas as minhas configurações na seção app.config do meu aplicativo (usando o ConfigurationManager.AppSettings aula).À medida que o usuário altera as configurações usando a interface do aplicativo (clicando nas caixas de seleção, escolhendo os botões de opção etc.), pretendo escrever essas alterações no AppSettings.Ao mesmo tempo, enquanto o programa estiver em execução, pretendo acessar o AppSettings constantemente de um processo que processará dados constantemente.As alterações nas configurações por meio da IU precisam afetar o processamento de dados em tempo real, e é por isso que o processo acessará o AppSettings constantemente.

Esta é uma boa ideia em relação ao desempenho?Usando AppSettings deveria ser "o caminho certo" para armazenar e acessar configurações ao escrever aplicativos .Net, mas me preocupo que esse método não tenha sido planejado para uma carga constante (pelo menos em termos de configurações sendo lidas constantemente).

Se alguém tiver experiência com isso, eu apreciaria muito a contribuição.

Atualizar: Eu provavelmente deveria esclarecer alguns pontos.

Este não é um aplicativo da web, portanto, conectar um banco de dados ao aplicativo pode ser um exagero simplesmente para armazenar definições de configuração.Este é um aplicativo Windows Forms.

De acordo com a documentação do MSDN, o ConfigurationManager serve para armazenar não apenas configurações no nível do aplicativo, mas também configurações do usuário.(Especialmente importante se, por exemplo, o aplicativo for instalado como um aplicativo de confiança parcial.)

Atualização 2: Aceitei a resposta de lomaxx porque Properties realmente parece uma boa solução, sem precisar adicionar camadas adicionais ao meu aplicativo (como um banco de dados).Ao usar Propriedades, ele já faz todo o cache sugerido por outros.Isso significa que quaisquer alterações e leituras subsequentes são feitas na memória, tornando-as extremamente rápidas.As propriedades apenas gravam as alterações no disco quando você solicita explicitamente.Isso significa que posso fazer alterações nas configurações dinamicamente em tempo de execução e, em seguida, salvar apenas no disco quando o programa for encerrado.

Apenas para verificar se ele realmente seria capaz de lidar com a carga necessária, fiz alguns testes em meu laptop e consegui fazer 750.000 leituras e 7.500 gravações por segundo usando Propriedades.Isso está muito além do que minha aplicação irá sempre chego perto de precisar que me sinta bastante seguro em usar Propriedades sem afetar o desempenho.

Foi útil?

Solução

como você está usando um aplicativo winforms, se estiver no .net 2.0, existe um sistema de configurações do usuário (chamado Propriedades) projetado para essa finalidade. Este artigo no MSDN tem uma introdução muito boa sobre isso

Se você ainda está preocupado com o desempenho, dê uma olhada em Edição compacta SQL que é semelhante ao SQLite, mas é a oferta da Microsoft que descobri que funciona muito bem com winforms e há até a capacidade de faça funcionar com Linq

Outras dicas

Confira SQLite, parece uma boa opção para este cenário específico.

Dylan,

Não use o arquivo de configuração do aplicativo para essa finalidade, use um banco de dados SQL (SQLite, MySQL, MSSQL, qualquer que seja) porque você terá que se preocupar menos com problemas de simultaneidade durante leituras e gravações no arquivo de configuração.

Você também terá melhor flexibilidade no tipo de dados que deseja armazenar.A seção appSettings é apenas uma lista de chave/valor que você pode superar com o passar do tempo e à medida que o aplicativo amadurece.Você poderia usar seções de configuração personalizadas, mas então você se encontrará em uma nova área problemática quando se trata de design.

O appSettings não se destina realmente ao que você está tentando fazer.

Quando seu aplicativo .NET é iniciado, ele lê o arquivo app.config e armazena em cache seu conteúdo na memória.Por esse motivo, depois de gravar no arquivo app.config, você terá que forçar de alguma forma o tempo de execução a analisar novamente o arquivo app.config para que ele possa armazenar as configurações em cache novamente.Isso é desnecessário

O melhor abordagem seria usar um banco de dados para armazenar suas configurações.

Exceto o uso de um banco de dados, você pode facilmente configurar um arquivo de configuração XML externo.Quando seu aplicativo for iniciado, você poderá armazenar em cache seu conteúdo em um objeto NameValueCollection ou objeto HashTable.Ao alterar/adicionar configurações, você faria isso na cópia em cache.Quando seu aplicativo for encerrado ou em um intervalo de tempo apropriado, você poderá gravar o conteúdo do cache novamente no arquivo.

Alguém me corrija se eu estiver errado, mas não acho que AppSettings normalmente seja usado para esse tipo de configuração.Normalmente você só colocaria configurações que permanecessem razoavelmente estáticas (strings de conexão de banco de dados, caminhos de arquivos, etc.).Se você quiser armazenar configurações de usuário personalizáveis, seria melhor criar um arquivo de preferências separado ou, idealmente, armazenar essas configurações em um banco de dados.

Eu não usaria arquivos de configuração para armazenar dados do usuário.Use um banco de dados.

Posso perguntar por que você não está salvando as configurações do usuário em um banco de dados?

Geralmente, eu salvo configurações do aplicativo que são alteradas com pouca frequência na seção appSettings (os logs de erro do endereço de e-mail padrão são enviados, o número de minutos após os quais você é desconectado automaticamente, etc.). , não no usuário, e geralmente é usado para configurações de implantação.

uma coisa que eu gostaria de fazer é armazenar em cache as configurações de aplicativos em uma leitura e, em seguida, liberar as configurações do cache na gravação, o que deve minimizar a quantidade de carga real com a qual o servidor precisa lidar para processar as configurações de aplicativos.

Além disso, se possível, veja como dividir o appSettings em seções de configuração para que você possa ler as configurações relacionadas à gravação e ao cache.

Dito tudo isso, eu consideraria seriamente armazenar esses valores em um banco de dados, pois você parece estar realmente armazenando Preferências de usuário, e não as configurações do aplicativo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top