ConfigurationManager.AppSettings缓存

45
我们知道IIS会缓存ConfigurationManager.AppSettings,这样它只需读取一次磁盘,直到web.config被修改。这是为了提高性能。
有人在:

http://forums.asp.net/p/1080926/1598469.aspx#1598469

有人说.NET Framework不会对app.config做同样的处理,但它会在每个请求时从磁盘读取。但我很难相信,因为这会使速度变慢。请告诉我他错了,否则我就得修改我写的每个Console/Windows Forms/Windows Services。

更新 我很遗憾地误解了上面链接论坛中人们所说的话。

6个回答

50

一个快速的测试似乎表明这些设置仅在应用程序启动时加载。

//edit the config file now.
Console.ReadLine();

Console.WriteLine(ConfigurationManager.AppSettings["ApplicationName"].ToString());
Console.WriteLine("Press enter to redisplay");

//edit the config file again now.
Console.ReadLine();
Console.WriteLine(ConfigurationManager.AppSettings["ApplicationName"].ToString());
Console.ReadLine();
你会发现所有的输出结果都保持不变。

22
仅仅挑剔一下,设置会在第一次被引用时加载,而不一定是在应用程序启动时。 - Samuel Neff
10
更加挑剔一些(离题了),不需要调用ToString()方法 - 它已经是一个字符串。 - Oskar Austegard
1
你只需要查看System.Configuration.ConfigurationManager类,就会发现该类及其属性都是静态的。 - heymega
6
为了获取更改,您将需要调用 ConfigurationManager.RefreshSection("appSettings")。您还可以添加文件监视器,仅在更改时重新加载它。 - Luis Perez
为什么除了静态构造函数之外还要访问任何东西呢?(假设没有添加手表)另外 - SamuelNeff,所有设置都是在第一次引用时读取的吗?还是你在说不同的设置在不同的时间从同一个文件中读取?如果是后者,我开始怀疑我们在Redmond的朋友们了。 - ruffin

4

试一下:

ConfigurationManager.RefreshSection("appSettings")

只需要小心文件名(在bin文件夹中

正常的文件名:appname.exe.config

如果是调试模式:appname.vshost.exe.Config


3

如果没有性能问题,就不要修复它。是否存在性能问题并不重要。


53
我在这里有些不同意。像这样的配置值可能会在应用程序的各种地方使用,包括嵌套循环等。了解读取配置文件是否需要微秒或毫秒是很重要的。 - Dave Markle

3
它在应用程序启动时仅一次读取应用程序配置文件(MyApp.exe.config),可以通过在应用程序运行时更改文件来轻松验证此操作。引用OP帖子中的评论是:Web.config的值在应用程序启动时存储到缓存/内存中,因此在对Web.config进行任何更改时应用程序会重新启动。请注意,这仅适用于Web.config,在ASP.NET应用程序中使用的其他.config文件默认情况下从磁盘访问。同样,在WinForms / Console应用程序中使用的除MyApp.exe.config之外的配置文件也是从磁盘访问的。该评论并未说明MyApp.exe.config默认情况下会从磁盘读取。

2

AppSettings被缓存了。你可以通过进一步缓存来限制namevaluecollection的查找,从而提高性能。

参见: DotNetPearls静态配置模式


1

正如John所说,只有在实际看到性能下降时才花更多时间来解决这个问题。

此外,我相信这些应用程序将配置保存在内存中,要想在配置中看到任何更改,必须重新启动应用程序。

有关一些进一步阅读的未解之谜。


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