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

System.Configuration类,像大多数(全部?)其他类微软的.Net库文件中,被标注有下列线程安全的信息:

  

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

通过我的这个阅读,ConfigurationSection对象从ConfigurationManager.GetSection(string)返回和其他类似的方法(例如OpenExeConfiguration(string exePath).GetSection(string))不能被假定为线程安全,因此不应由多个执行环境中使用。这禁止在一个单,否则将是线程安全的,因为同时访问部分对象可能是安全的,对象本身上的成员不是安全存储ConfigurationSection

GetSection多方通话,但是,很可能需要在配置文件中的重新分析和分配新ConfigurationSection情况下具有很高的开销考虑的配置是不可能的初始化后不断改变。此外,配置数据复制到已经取得线程安全的另一个对象似乎战胜的首先使用内置的配置包的主要好处之一(以类型转换易于访问和验证的配置信息,而无需太多样板码)。

因此,有不诉诸过量解析和配置部分的分配,以使用System.Configuration在一个线程安全的方式的方法吗?是否实现自己的ConfigurationSection从缺乏即使你通过System.Configuration接口访问它由微软提供的(担保释放你如果是这样,则需要访问基ConfigurationSection的索引时,你会如何实现它是线程安全的用于访问配置数据)?

有帮助吗?

解决方案

这GetSection返回的实例不是线程安全的。这意味着你需要,才能在单用它增加了锁定代码。

多个调用不会重新解析文件,除非该文件已更改。数据被缓存在存储器中。

您线程安全的问题很容易通过锁定(我不知道你需要的,除非你改变在运行时配置)解决,并没有性能问题。

其他提示

ConfigurationManager.GetSection(串)是一个公共静态成员,因为MSDN国的任何公共静态(在Visual Basic中共享)此类型的成员是线程安全的',你可以认为它是安全的使用。

至于性能,我愿意假定MS取得了它非常有效地已经,只是用他们的职能是。记住:过早的优化是邪的根

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top