线程安全使用System.Configuration

iam*_*ael 9 .net c# multithreading system.configuration

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

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

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

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

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

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

Joh*_*ers 5

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

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

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