只读字典 - 多个线程调用.ContainsKey方法

Mar*_*909 24 .net c# concurrency multithreading dictionary

我有一个静态只读字典.不会对此词典进行任何修改.

我有多个线程使用.ContainsKey(Key)从这本字典中读取.例如

class MyData
{ 
    private static private IDictionary<int, string> _dictionary = new Dictionary<int, string>();

    MyData()
    {
        // Load Dictionary here
    }

    public string GetValue(int key)
    {
        if (_dictionary.ContainsKey(key))
        { 
            return _dictionary[key];   
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这样做有任何线程问题吗?

Mar*_*ell 20

如果没有人改变它:这很好.如果偶尔进行编辑,那么可以查看ReaderWriterLockSlim,或者(我的偏好)编辑快照/副本并交换引用.

  • @Mark - 使用TryGetValue只能解除引用一次,因此行为定义明确(可行); 如果你单独使用ContainsKey然后获取,你需要**将引用复制到局部变量中,否则冒第二个引用是另一个具有不同数据的字典. (2认同)

Dar*_*rov 5

如果你只是想读书,这是安全的.