Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 多线程和静态构造函数_C# - Fatal编程技术网

C# 多线程和静态构造函数

C# 多线程和静态构造函数,c#,C#,假设我有以下课程: class Dummy { public static Dictionary<int, int> dict = new Dictionary<int, int>(); // (1) static Dummy() // (2) { dict.Add(1, 100); dict.Add(2, 200); } } 类虚拟 { 公共静态字典dict=newdictiona

假设我有以下课程:

class Dummy
{
    public static Dictionary<int, int> dict = new Dictionary<int, int>();  // (1)

    static Dummy()   // (2)
    {
        dict.Add(1, 100);
        dict.Add(2, 200);
    }        
}
类虚拟
{
公共静态字典dict=newdictionary();/(1)
静态虚拟对象()/(2)
{
新增(1100条);
dict.Add(2200);
}        
}

此类型将由多个线程访问。何时执行第(1)和(2)条?它们会为每个线程执行吗?是否可能发生密钥复制异常?

无论何时创建第一个实例,都会访问它们。没有复制密钥的机会。它们只会发生一次。如果在处理静态构造函数的过程中发生错误,将不会再次访问它


有关此调用的原子性,请参见下面的JohnSaunders注释。

请参见:-“静态构造函数保证每个应用程序域只运行一次”。而且:我并不认为它会改变线程安全性(我不认为这是一个问题),但是您可以编写
publicstaticdictionary dict=newdictionary{{11100},{2200}如果您愿意。那么您就不需要手工编写静态构造函数了。(静态构造函数仍然会生成,所以我想线程问题不会因此而改变,所以这只是你觉得哪种代码更吸引人的问题。)它们只会发生一次,但不会以原子方式出现。如果两个线程访问该类型,则其中一个线程可能会看到一种状态,即
dict
只有一个条目,或者没有条目。@JohnSaunders同意。@JohnSaunders如何解决原子问题?我可以使用Lazy初始化吗?@smwikipedia:我不知道Lazy
是否是原子的。您可以通过添加
private static object\u locker=new object()来解决问题
然后
static Dummy(){lock(_locker){dict.Add(1100);dict.Add(2200)}
。您也不应该使用公共字段。请改用属性。@JohnSaunders您是否声称一个线程可以在静态构造函数(比如在另一个线程上运行)结束之前访问类的静态成员?