キューを列挙しながら、私は次の例外を取得しています修正されました:の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メソッドは()。質問は、どのように私はその "パターン"を正しく実装するのですか?
なぜキューをロックしていますか?このコードは私には意味がありません。 –
@Kermit_xc:列挙子のドキュメントの大きなポイントは、「列挙子はコレクションへの排他アクセスを持たないため、コレクションを列挙することは本質的にスレッドセーフな手順ではありません。列挙中にスレッドの安全性を保証するには、コレクション全体を読み書きするために複数のスレッドがアクセスできるようにするには、独自の同期を実装する必要があります。 –
右。このコードはあまりにも漠然としたことをしません。 –