我有第二个线程,我运行一个永无止境的循环(它监听传入的TCP请求)。
在该线程/循环中,我更新了一个保存核心数据的字典。在我的winform GUI中,我想访问字典并显示信息。但是,如果我编写一个foreach循环,我会得到字典已被修改的异常。
我如何安全地访问该词典?我尝试克隆但没有克隆方法。我不想要锁来访问它。我想做一些像调用的东西,但它似乎没有出现我可以在一个线程中调用一个函数?
那我该如何访问呢?
答案 0 :(得分:4)
如果您使用的是.NET 4,则可以使用ConcurrentDictionary
。否则,我认为你真的 来锁定它。
您可以构建自己的调用机制来封送对其他线程的调用,但这可能很棘手。
如果您因为性能原因而担心锁定,则值得检查您的担忧是否合理。如果你确定在锁定的任何地方你只能在很短的时间内完成锁定,你可能会很好。有一件事是使用appopriate constructor:
创建字典的副本Dictionary<Foo, Bar> copy = new Dictionary<Foo, Bar>(existing);
请注意,您仍然需要确保在构建期间可以独占访问字典 - 但是您可以释放锁定并将副本用于您的内容。当然,如果键和值是可变的,那么你还有另外一组问题......
答案 1 :(得分:2)
如果可能,那么我建议切换到.net 4,它有大量与并行编程相关的更新,包括ConcurrentDictionary。
如果没有,您可以查看以下答案:whats-the-best-way-of-implementing-a-thread-safe-dictionary-in-net
答案 2 :(得分:0)
您可以自己实现控制并发操作的IDictionary<TKey, TValue>
。
http://msdn.microsoft.com/en-us/library/system.collections.idictionary.aspx