9

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

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

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

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

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

那么,有没有一种方法可以System.Configuration以线程安全的方式使用,而不需要过度解析和分配配置部分?ConfigurationSection即使您通过接口访问它,实现您自己的功能是否使您免于 Microsoft 提供的缺乏保证(如果是这样,当需要访问 base的索引器System.Configuration时,您将如何实现它是线程安全的?ConfigurationSection访问配置的数据)?

4

2 回答 2

5

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

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

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

于 2009-04-14T03:19:57.013 回答
0

ConfigurationManager.GetSection(string) 是一个公共静态成员,并且由于 msdn 声明“这种类型的任何公共静态(在 Visual Basic 中共享)成员都是线程安全的”,您可以假设它可以安全使用。

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

于 2009-04-14T03:12:35.953 回答