Ars*_*yan 27 c# dictionary concurrent-collections c#-4.0
正如MSDN所说
ConcurrentDictionary<TKey, TValue> Class表示可以由多个线程同时访问的键值对的线程安全集合.
但据我所知,System.Collections.Concurrent课程是为PLINQ设计的.
我有Dictionary<Key,Value>保持服务器中的在线客户端,并且当我有权访问它时通过锁定对象使其成为线程安全的.
我可以放心地取代Dictionary<TKey,TValue>通过ConcurrentDictionary<TKey,TValue>我的情况?更换后性能会提高吗?
这里在第5约瑟夫阿尔巴哈利提到,它专为并行编程
Ada*_*son 17
如果不知道你在锁中做了什么,那就不可能说了.
例如,如果您的所有字典访问都如下所示:
lock(lockObject)
{
foo = dict[key];
}
... // elsewhere
lock(lockObject)
{
dict[key] = foo;
}
Run Code Online (Sandbox Code Playgroud)
然后你可以将它切换出来(虽然你可能不会看到性能上的任何差异,所以如果没有破坏,不要修复它).但是,如果您在与字典交互的锁定块中执行任何操作,那么您必须确保字典提供单个函数,该函数可以完成您在锁定块中所执行的操作,否则您最终会得到与以前功能不同的代码.要记住的最重要的事情是字典只保证对字典的并发调用以串行方式执行; 它无法处理您的代码中有多个与字典交互的单个操作的情况.这样的情况,如果不考虑ConcurrentDictionary,需要您自己的并发控制.
值得庆幸的是,它ConcurrentDictionary提供了一些辅助函数,用于更常见的多步操作,如AddOrUpdate或GetOrAdd,但它们无法涵盖所有情况.如果你发现自己不得不把你的逻辑搞砸到这些函数中,那么处理你自己的并发可能会更好.
这不是简单的替换Dictionary用ConcurrentDictionary,你需要去适应你的代码,因为这些类具有不同行为的新方法,以保证线程安全。
例如,而不是调用Add或者Remove,你有TryAdd和TryRemove。使用这些以原子方式运行的方法很重要,就像您进行两次调用一样,第二次调用依赖于第一个的结果,您仍然会遇到竞争条件并且需要lock.