【发布时间】:2010-11-12 08:46:33
【问题描述】:
我在通过队列枚举时遇到以下异常:
System.InvalidOperationException: 收藏已修改;枚举 操作可能无法执行
这里是代码摘录:
1: private bool extractWriteActions(out List<WriteChannel> channelWrites)
2: {
3: channelWrites = new List<WriteChannel>();
4: foreach (TpotAction action in tpotActionQueue)
5: {
6: if (action is WriteChannel)
7: {
8: channelWrites.Add((WriteChannel)action);
9: lock(tpotActionQueue)
10: {
11: action.Status = RecordStatus.Batched;
12: }
13: }
14: }
15: return (channelWrites.Count > 0);
16: }
我想我理解这个问题 - 更改 action.Status = RecordStatus.Batched 的哈希表,这会搞砸枚举器上的 MoveNext()。
问题是,我如何正确实现该“模式”?
【问题讨论】:
-
为什么要锁定队列?这段代码对我来说毫无意义。
-
@Kermit_xc:枚举器文档中更大的一点是“枚举器没有对集合的独占访问权;因此,通过集合枚举本质上不是线程安全的过程。为了保证线程枚举时的安全性,可以在整个枚举过程中锁定集合。要让集合被多线程访问读写,必须自己实现同步。”
-
对。这段代码甚至没有做任何类似的事情。
-
如果您需要在多个线程上同步读取器和写入器,请考虑使用读写器锁。
标签: c# collections thread-safety