安全访问另一个线程中的字典?

时间:2010-07-22 08:48:42

标签: c# .net multithreading

我有第二个线程,我运行一个永无止境的循环(它监听传入的TCP请求)。

在该线程/循环中,我更新了一个保存核心数据的字典。在我的winform GUI中,我想访问字典并显示信息。但是,如果我编写一个foreach循环,我会得到字典已被修改的异常。

我如何安全地访问该词典?我尝试克隆但没有克隆方法。我不想要锁来访问它。我想做一些像调用的东西,但它似乎没有出现我可以在一个线程中调用一个函数?

那我该如何访问呢?

3 个答案:

答案 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