C#线程全局配置设置的安全性

Led*_*Led 6 c# configuration multithreading

在C#应用程序中,假设我有一个包含一些配置项的全局类,如下所示:

public class Options  
{  
    int myConfigInt;  
    string myConfigString;  
    ..etc.  
}  

static Options GlobalOptions;  
Run Code Online (Sandbox Code Playgroud)

这个类的成员将用于不同的线程:

Thread1: GlobalOptions.myConfigString = blah;
Run Code Online (Sandbox Code Playgroud)

Thread2: string thingie = GlobalOptions.myConfigString;
Run Code Online (Sandbox Code Playgroud)

当2个线程访问不同的成员时,使用锁来访问GlobalOptions对象也会不必要阻塞,但另一方面,为每个成员创建一个sync-object似乎也有点过头了.

此外,使用全局选项上的锁定会使我的代码不那么好看; 如果我要写

string stringiwanttouse;
lock(GlobalOptions)
{
   stringiwanttouse = GlobalOptions.myConfigString;
}
Run Code Online (Sandbox Code Playgroud)

到处都是(这是线程安全的还是stringiwanttouse现在只是一个指向myConfigString的指针?是的,我是C#的新手......)而不是

string stringiwanttouse = GlobalOptions.myConfigString;
Run Code Online (Sandbox Code Playgroud)

它使代码看起来很糟糕.

那么......确保线程安全的最佳(也是最简单!)方法是什么?

Mik*_*ike 4

您可以将有问题的字段(在本例中为 myConfigString)包装在 Property 中,并在 Get/Set 中包含使用 Monitor.Lock 或 Mutex 的代码。然后,访问该属性仅锁定该单个字段,而不会锁定整个类。

编辑:添加代码

private static object obj = new object(); // only used for locking
public static string MyConfigString {
    get {
       lock(obj)
       {
          return myConfigstring;
       }
    }
    set {
       lock(obj)
       {
          myConfigstring = value;
       }
    }
}
Run Code Online (Sandbox Code Playgroud)