2

ConcurrentBag<T>別のスレッドがこのバッグを列挙しているときに、あるスレッドが a の要素を追加または削除するとどうなりますか? 新しい要素も列挙に表示され、削除された要素は表示されませんか?

4

2 に答える 2

6

優れたマニュアルを読んで、次のことを発見できます。

ConcurrentBag<T>.GetEnumerator方法

列挙は、バッグの内容の瞬間的なスナップショットを表します。GetEnumerator が呼び出された後のコレクションへの更新は反映されません。列挙子は、バッグからの読み取りおよびバッグへの書き込みと同時に安全に使用できます

鉱山を強調します。

于 2013-06-06T01:43:28.790 に答える
1

Justin Etheredge には、クラスの機能を説明するブログ投稿があります。ConcurrentBag

列挙型をスレッド セーフとして実装するために、GetEnumerator メソッドは、反復処理を開始したときの ConcurrentBag の瞬間的なスナップショットを返します。このようにして、列挙が開始された後に追加されたアイテムは、データ構造を繰り返し処理している間は表示されません。

つまり、 の列挙を開始するConcurrentBag<T>と、現在の状態のスナップショットが作成されます。列挙は、列挙が開始された時点でバッグに存在していた要素のみを表示します。

他のスレッドは引き続き好きなように要素を追加および削除できますが、列挙によって表示される要素のセットは変更されません。

于 2013-06-06T01:36:35.617 に答える