繁体   English   中英

线程安全使用System.Configuration

[英]Thread safe usage of System.Configuration

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

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

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

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM