我收到以下異常,同時通過隊列列舉:System.InvalidOperationException:集合已修改
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()。 問題是,我如何正確實現「模式」?
你爲什麼鎖定隊列?這段代碼對我來說沒有意義。 – 2009-07-20 15:54:15
@Kermit_xc:枚舉器文檔中的重點在於「枚舉器不具有對集合的獨佔訪問權限;因此,枚舉集合本質上不是線程安全的過程。爲了確保枚舉期間的線程安全,您可以鎖定在整個枚舉過程中的集合爲了讓集合可以被多個線程訪問來讀寫,你必須實現自己的同步。「 – 2009-07-20 16:22:43
對。這個代碼甚至沒有做任何事情,甚至含糊不清。 – 2009-07-20 20:11:43