在多线程环境中返回c#中的字典

Thi*_*Ybt 6 c# concurrency dictionary return

我已经宣布了一个词典的字典:

Dictionary<String, Dictionary<String, String>> values;
Run Code Online (Sandbox Code Playgroud)

我有一个getter来获取特定索引的字典:

public Dictionary<String,String> get(String idx)
{
    lock (_lock)
    {
        return values[moduleName];
    }
}
Run Code Online (Sandbox Code Playgroud)

如您所见,我正在多线程环境中工作.我的问题是我需要返回我的字典的副本,以便像这样线程安全:

public Dictionary<String,String> get(String idx)
{
    lock (_lock)
    {
        return new Dictionary<string, string>(values[moduleName]);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我没有,那么调用getter的类会收到一个副本(所以如果我从Dictionary<String, Dictionary<String, String>>遗嘱中删除这个字典它仍然可以工作)?

干杯,

蒂埃里.

Chr*_*Fin 6

Dictionary<>不是线程安全的,但是ConncurrentDictionary<>.

调用getter的类接收一个引用,这意味着如果你从values-Dictionary中删除它仍然会在那里,因为只要你在某个地方有一个引用,GC就不会清除它,你只是无法用getter获取它了.

Basicaly意味着您在使用时有两种可能性Dictionary<>:

  • 返回副本:错误的想法,因为如果您更改配置,您的应用程序中有两个不同的配置"活着"
  • 锁定实例:这将使它成为线程安全的,但然后使用ConcurrentDictionary<>就像它完全适合你


Jon*_*nna 4

如果您确实需要返回字典本身,那么您将需要制定线程如何锁定它的规则(很脆弱,如果存在不这样做的情况怎么办?),以只读方式使用它方式(字典对于只读来说是线程安全的,但请注意,这假设该类私有的代码也不再写入它),使用线程安全字典(ConcurrentDictionary使用条带锁定,我ThreadSafeDictionary使用锁-免费方法,并且有不同的情况,其中一个击败另一个),或者按照您的建议复制一份。

或者,如果您公开一种方法来检索或设置两个键找到的最终字符串,枚举一个键找到的二级键等等,那么您不仅可以控制在一个键中完成的锁定但它在接口的清洁性和从接口中释放实现方面还有其他优点(例如,您可以从基于锁转向使用线程安全字典,或者反之亦然,而不影响调用代码)。