3

如果我得到这样的值:

string value = ConfigurationManager.AppSettings["Key"];

我期待.Net(在我的情况下为MVC4)在启动应用程序域时解析了应用程序设置,我实际上是从内存中读取的。

如果不是这种情况,并且每次都会命中文件,那么在获取 AppSettings 时是否有任何线程安全保证?

快速尝试使用我的 Google-Fu 失败了。

我倾向于使用这种机制来填充构造函数中的实例字段,因此:

public class MyThing 
{
  private readonly string thingValue;

  public MyThing() 
  {
    thingValue = ConfigurationManager.AppSettings["Key"];
  }
}

我们最近遇到了一个外部依赖失败的场景,因为它们存在竞争条件并且“无法读取配置设置”。

这让我想知道:

  • AppSettings 是线程安全的吗?
  • 只读字符串模式是否提供足够的保护?
4

1 回答 1

2

而且,通常情况下,几乎我一问这个问题,我的 google-fu 就开始了:/

MSDN 将 AppSettings 方法列为

public static NameValueCollection AppSettings { get; }

但实际上并没有提到线程安全。

但是,ConfigurationManager 类的页面有一个关于线程安全的部分,上面写着:

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

所以看来我列出的机制是线程安全的。不过,我仍然有兴趣看到替代方法!

于 2013-10-17T08:50:55.747 回答