ConfigurationManager.AppSettings性能问题

我计划将我的所有配置设置存储在我的应用程序的app.config部分(使用 ConfigurationManager.AppSettings 类)。当用户使用应用程序的UI更改设置(单击复选框,选择单选按钮等)时,我计划将这些更改写入到 AppSettings 中。同时,在程序运行时,我打算不断地从一个不断处理数据的进程访问 AppSettings 。通过用户界面对设置进行更改需要实时影响数据处理,这就是为什么进程会不断访问 AppSettings

在性能方面这是一个好主意吗?使用 AppSettings 在编写.Net应用程序时应该是“正确的方式”来存储和访问配置设置,但我担心这种方法不适用于恒定负载(至少在不断阅读设置)。

如果有人有这方面的经验,我会非常感谢意见。

Update: I should probably clarify a few points.

这不是一个Web应用程序,因此将数据库连接到应用程序可能只是为了存储配置设置而过度使用。这是一个Windows窗体应用程序。

根据MSDN文档, ConfigurationManager 不仅用于存储应用程序级别设置,还用于存储用户设置。 (例如,如果应用程序作为部分信任应用程序安装,则尤其重要。)

Update 2: I accepted lomaxx's answer because Properties does indeed look like a good solution, without having to add any additional layers to my application (such as a database). When using Properties, it already does all the caching that others suggested. This means any changes and subsequent reads are all done in memory, making it extremely fast. Properties only writes the changes to disk when you explicitly tell it to. This means I can make changes to the config settings on-the-fly at run time and then only do a final save out to disk when the program exits.

为了验证它实际上能够处理我需要的负载,我在我的笔记本电脑上做了一些测试,并且能够使用属性每秒执行750,000次读取和7,500次写入。这远远超出了我的应用程序甚至会超过我们的应用程序甚至会接近需要在使用Properties时感觉非常安全而不会影响性能的情况。

0

8 答案

我可以问你为什么不把用户的设置保存在数据库中吗?

通常,我会保存appSettings部分中很少更改的应用程序设置(发送默认电子邮件地址错误日志,自动注销之后的分钟数等)。范围确实在应用程序中,而不是用户,并且通常用于部署设置。

0
额外

看看SQLite,这对于这种特殊场景来说似乎是一个很好的选择。

0
额外

有人纠正我,如果我错了,但我不认为AppSettings通常用于这些类型的配置设置。通常情况下,你只会放入相当静态的设置(数据库连接字符串,文件路径等)。如果要存储可定制的用户设置,最好创建一个单独的首选项文件,或理想地将这些设置存储在数据库中。

0
额外

appSettings并不是真正意义上的你想要做的。

当您的.NET应用程序启动时,它会读入app.config文件,并将其内容缓存在内存中。因此,在写入app.config文件之后,您必须强制运行时重新解析app.config文件,以便它可以再次缓存设置。这是不必要的

最佳方法是使用数据库来存储您的配置设置。

除了使用数据库,您可以轻松设置外部XML配置文件。当您的应用程序启动时,您可以将其内容缓存在NameValueCollection对象或HashTable对象中。在更改/添加设置时,您可以将其添加到该缓存副本。当您的应用程序关闭时,或者在适当的时间间隔内,您可以将缓存内容写回文件。

0
额外

我想要做的一件事就是缓存读取上的appsettings,然后在写入时从缓存中清除设置,这应该尽量减少服务器处理appSettings所需处理的实际负载量。

另外,如果可能,请考虑将appSettings设置为 configSections ,以便您可以读取写入和缓存相关设置。

说完这一切,我会认真考虑将这些值存储在数据库中,因为您似乎实际上正在存储用户首选项,而不是应用程序设置。

0
额外

由于您使用的是Winforms应用程序,如果它使用.net 2.0,实际上有一个用户设置系统(称为属性),专门用于此目的。 这篇关于MSDN的文章有一个相当不错的介绍进入这个

If you're still worried about performance then take a look at SQL Compact Edition which is similar to SQLite but is the Microsoft offering which I've found plays very nicely with winforms and there's even the ability to make it work with Linq

0
额外

我不会使用配置文件来存储用户数据。使用分贝。

0
额外

迪伦,

不要为此使用应用程序配置文件,请使用SQL DB(SQLite,MySQL,MSSQL等),因为在读取和写入配置文件期间,您不必担心并发问题。

您还可以在要存储的数据类型中拥有更好的灵活性。 appSettings部分只是一个键/值列表,随着时间的推移和应用程序的成熟,您可能会长大。您可以使用自定义配置部分,但是当涉及到设计时,则会进入新的问题区域。

0
额外