【发布时间】:2015-02-11 23:12:40
【问题描述】:
我正在尝试学习如何使用线程,但我坚持使用并发集合。
我有一个应用程序,其中我列出了 unfinishedOBjectsList<MyObject> 对象和一个方法,它们对特定对象进行了一些更改(类似于 DoChange(MyObject object) )。之后,该对象从第一个列表中取出并插入finishedObjectsList<MyObject>。
现在,我想使用线程运行该方法,它工作正常 - 每个线程都对它在 unfinishedOBjectsList 中找到的特定对象进行了一些更改(更改很小,所以我添加了 ThreadSleep() 以模拟对象的更长处理) ,将其从 unfinishedOBjectsList 中移除并放入第二个列表中。
我想要实现的下一步是会有另一种方法(例如,由用户使用按钮处理),它允许用户从第一个列表中选择任何对象并手动删除它。我想模拟的“问题”是,如果对象正在被线程“处理”,用户应该无法将其从列表中删除。
我尝试了 ConcurrentQueue - 但问题是,使用队列时,我无法删除特定对象(使用像列表一样的 Remove(MyObject) 之类的东西)。之后,我尝试了 ConcurrentBag 和 BlockingCollection,但问题是一样的 - 我能够删除集合中的下一个对象,但不能删除集合中间的对象。
我考虑过使用字典,但我不明白为什么我应该使用带有键值参数的字典,而我只需要存储对象。
我的问题是——我什至应该在这种情况下使用 ConcurrentCollections 吗?还是我应该简单地锁定列表并保持原样?处理多重访问列表时,正确的方法是什么?
谢谢
【问题讨论】:
标签: c# multithreading collections concurrency