是否有一种简单的方法可以通过线程安全接口(interface)访问基于自定义 System.Configuration 的配置数据,而不需要每个执行上下文加载/重新加载配置信息,这在计算上会很麻烦?
System.Configuration 类与 Microsoft 的 .Net 库文档中的大多数(所有?)其他类一样,使用以下线程安全信息进行注释:
Any public static (Shared in Visual Basic) members of this type are thread safe. Any instance members are not guaranteed to be thread safe.
根据我的阅读,从 ConfigurationManager.GetSection(string)
和其他类似方法(例如 OpenExeConfiguration(string exePath))返回的
) 是线程安全的,因此不应由多个执行上下文使用。这禁止将 ConfigurationSection
对象。不得假定 GetSection(string)ConfigurationSection
存储在单例中,否则将是线程安全的,因为虽然对部分对象的访问可能是安全的,但对象本身的成员并不安全。
然而,多次调用 GetSection
可能需要重新解析配置文件并分配新的 ConfigurationSection
实例,考虑到配置不是初始化后可能会发生变化。此外,将配置数据复制到另一个线程安全的对象中似乎首先破坏了使用内置配置包的主要好处之一(无需太多样板即可轻松访问类型转换和验证的配置信息代码)。
那么,有没有一种方法可以线程安全的方式使用 System.Configuration
,而无需诉诸过多的配置节解析和分配?实现您自己的 ConfigurationSection
是否使您免于 Microsoft 提供的缺乏保证,即使您通过 System.Configuration
接口(interface)访问它(如果是这样,您将如何当访问配置数据需要访问基 ConfigurationSection
的索引器时,将其实现为线程安全的)?
最佳答案
从 GetSection 返回的实例不是线程安全的。这意味着您需要添加锁定代码才能在您的单例中使用它。
多次调用不会重新解析文件,除非文件已更改。数据缓存在内存中。
你的线程安全问题很容易通过使用锁定来解决(我不确定你是否需要,除非你在运行时更改配置),并且没有性能问题。
关于c# - System.Configuration 的线程安全使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/745384/