线程安全使用System.Configuration

时间:2009-04-13 21:00:02

标签: c# .net multithreading system.configuration

是否有一种通过线程安全接口访问自定义基于System.Configuration的配置数据的简单方法,而不需要每个执行上下文加载/重新加载配置信息,这在计算上会很麻烦?

System.Configuration类与Microsoft的.Net库文档中的大多数(所有?)其他类一样,使用以下线程安全信息进行注释:

  

此类型的任何公共静态(在Visual Basic中为Shared)成员都是线程安全的。   不保证任何实例成员都是线程安全的。

通过我的阅读,从ConfigurationSection返回的ConfigurationManager.GetSection(string)对象和其他类似的方法(例如OpenExeConfiguration(string exePath).GetSection(string))不能被认为是线程安全的,因此不应该是由多个执行上下文使用。这禁止在单例中存储ConfigurationSection否则是线程安全的,因为虽然对section对象的访问可能是安全的,但对象本身的成员本身并不安全。

然而,对GetSection的多次调用可能需要重新解析配置文件并分配具有高开销的新ConfigurationSection实例,因为初始化后配置不太可能发生变化。此外,将配置数据复制到另一个已成为线程安全的对象似乎打败了首先使用内置配置包的主要好处之一(轻松访问经过类型转换和验证的配置信息,而无需太多样板码)。

那么,有没有办法以线程安全的方式使用System.Configuration而不需要过多的解析和配置部分的分配?即使您通过ConfigurationSection接口访问它,实现您自己的System.Configuration也可以使您免于Microsoft提供的保证(如果是这样,那么如何实现它是线程安全的访问配置数据需要访问基础ConfigurationSection的索引器?)

2 个答案:

答案 0 :(得分:5)

从GetSection返回的实例不是线程安全的。这意味着您需要添加锁定代码才能在单例中使用它。

多次调用不会重新解析文件,除非文件已更改。数据缓存在内存中。

使用锁定可以轻松解决您的线程安全问题(我不确定您是否需要,除非您在运行时更改配置),并且没有性能问题。

答案 1 :(得分:0)

ConfigurationManager.GetSection(string)是一个公共静态成员,由于msdn声明“此类型的任何公共静态(在Visual Basic中共享)成员是线程安全的”,因此您可以认为它是安全的。

至于性能,我愿意假设MS已经使它非常有效并且只是按原样使用它们的功能。记住:过早优化是邪恶的根源。