Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.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# 只读字典-多线程调用.ContainsKey方法_C#_.net_Multithreading_Concurrency_Dictionary - Fatal编程技术网

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

C# 只读字典-多线程调用.ContainsKey方法,c#,.net,multithreading,concurrency,dictionary,C#,.net,Multithreading,Concurrency,Dictionary,我有一本静态的、只读的词典不将对此词典进行修改 我有多个线程使用.ContainsKey(键)读取此词典。e、 g 类MyData { 私有静态私有IDictionary_dictionary=新字典(); MyData() { //在这里加载字典 } 公共字符串GetValue(int键) { 如果(_dictionary.ContainsKey(键)) { 返回字典[键]; } } } 执行此操作是否存在线程问题?如果没有人对其进行变异:这很好。如果偶尔会有编辑,那么可以查看Reade

我有一本静态的、只读的词典将对此词典进行修改

我有多个线程使用.ContainsKey(键)读取此词典。e、 g

类MyData
{ 
私有静态私有IDictionary_dictionary=新字典();
MyData()
{
//在这里加载字典
}
公共字符串GetValue(int键)
{
如果(_dictionary.ContainsKey(键))
{ 
返回字典[键];
}
}
}

执行此操作是否存在线程问题?

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

如果您只想阅读,则是安全的。

如果在从多个线程读取之前,所有的“添加”都已完成,则可以。仅仅因为它是只读的并不意味着它是线程安全的——事实并非如此


也许您应该使用
ReaderWriterLock
来同步访问

如果您要同时写入数据(并且正在使用.NET 4.0),那么您可以使用

,但在交换引用时仍然需要readerwriterlocksim,对吗?@Mark:写入引用保证是原子的,但我想您可能想标记字段<代码> Value,以确保任何其他线程都看到这个变化。我猜我在想,如果您在运行CaveSKEY方法的中间交换引用,那么它可能会引起问题吗?@ Mark:您应该瞄准使用<代码> TyGETValue而不是
dict.ContainsKey
后跟
dict[key]
。如果您这样做,那么旧的ref将被原子地读取一次,并且您将从字典的旧副本中获得您的值。@标记-使用TryGetValue,您只需取消引用一次,因此行为定义良好(它可以工作);如果执行单独的ContainsKey-then-fetch,则需要将引用复制到局部变量中,否则第二次取消引用的风险是使用不同数据的不同字典。
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];   
        }
    }
}