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)
它使代码看起来很糟糕.
那么......确保线程安全的最佳(也是最简单!)方法是什么?
您可以将有问题的字段(在本例中为 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)
| 归档时间: |
|
| 查看次数: |
4373 次 |
| 最近记录: |