配置管理器.AppSettings的性能问题

27
我计划将所有的配置设置存储在应用程序的app.config部分中(使用ConfigurationManager.AppSettings类)。当用户使用应用程序的UI更改设置(点击复选框,选择单选按钮等)时,我打算将这些更改写入AppSettings。同时,在程序运行时,我计划从一个将不断处理数据的进程中不断访问AppSettings。通过UI对设置的更改需要实时影响数据处理,这就是为什么该进程将不断访问AppSettings的原因。
关于性能,这样做是否是一个好主意?在编写.Net应用程序时,使用AppSettings被认为是“正确的”存储和访问配置设置的方式,但我担心这种方法并非旨在承受持续的负载(至少在不断读取设置方面)。
如果有人有相关经验,我将非常感谢您的建议。
更新:我应该澄清一些观点。
这不是Web应用程序,因此仅为存储配置设置连接数据库可能有些过度。这是一个Windows窗体应用程序。
根据MSDN文档,ConfigurationManager不仅可用于存储应用程序级别的设置,还可用于存储用户设置。(特别重要的是,如果应用程序被安装为部分信任应用程序。)
更新2:我接受了lomaxx的答案,因为Properties确实看起来是一个很好的解决方案,而不需要添加任何额外的应用程序层(如数据库)。使用Properties时,它已经执行了其他人建议的所有缓存。这意味着所有更改和随后的读取都在内存中完成,使其非常快速。属性只有在您明确告诉它时才会将更改写入磁盘。这意味着我可以在运行时即时更改配置设置,然后只在程序退出时进行最终保存到磁盘。

仅仅为了验证它是否能够处理我需要的负载,我在我的笔记本上做了一些测试,使用Properties每秒能够进行750,000次读取和7,500次写入操作。这远远超出了我的应用程序将永远需要的范围,所以我非常放心地使用Properties而不影响性能。

8个回答

10

由于您正在使用WinForms应用程序,如果它是.NET 2.0版本的,则实际上有一个用户设置系统(称为属性),专门为此目的而设计。 MSDN上的这篇文章对此进行了很好的介绍。

如果仍然担心性能问题,请查看SQL Compact Edition,它类似于SQLite,但是是微软提供的解决方案,我发现它与WinForms非常兼容,甚至还可以使用Linq


2

可以考虑使用SQLite,它似乎是这种情况下的一个不错选择。


2

Dylan,

不要使用应用程序配置文件来完成此任务,请使用SQL DB(如SQLite、MySQL、MSSQL等),因为在对配置文件进行读写时,您需要更少地担心并发问题。

您还将获得更好的灵活性,以存储所需类型的数据。appSettings部分只是一个键/值列表,随着时间的推移和应用程序的成熟,您可能会发现这个列表过于简单。您可以使用自定义配置部分,但那会带来新的设计问题。


2

appSettings并不适合你所尝试的操作。

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

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

如果不使用数据库,你可以轻松地设置一个外部的XML配置文件。当你的应用程序启动时,你可以将其内容缓存在NameValueCollection对象或HashTable对象中。当更改/添加设置时,你可以在缓存副本中进行。当你的应用程序关闭或在适当的时间间隔时,可以将缓存内容重新写回文件。


1

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


1
我不会使用配置文件来存储用户数据。请使用数据库。

0

我可以问一下,为什么不把用户设置保存到数据库中吗?

通常,我会将很少更改的应用程序设置保存在appSettings部分(默认电子邮件地址错误日志被发送到的位置,自动注销之前的分钟数等)。这个作用域实际上是在应用程序层面,而不是在用户层面,并且通常用于部署设置。


0

我会建议考虑的一件事是,在读取时将 appsettings 缓存起来,然后在写入时从缓存中清除设置,这样可以最大程度地减少服务器处理 appSettings 的实际负载。

另外,如果可能的话,可以考虑将 appSettings 拆分成configSections,以便可以读取、写入和缓存相关的设置。

话虽如此,我会认真考虑将这些值存储在数据库中,因为你似乎实际上是在存储用户偏好,而不是应用程序设置。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接