4 に答える
確かに aBlockingCollection
を使用できますが、そうすることにはまったく意味がありません。
BlockingCollection
まず、は を実装するコレクションのラッパーであることに注意してくださいIProducerConsumerCollection<T>
。そのインターフェイスを実装する任意の型を、基になるストレージとして使用できます。
オブジェクトを作成するとき
BlockingCollection<T>
、制限された容量だけでなく、使用するコレクションのタイプも指定できます。たとえば、ConcurrentQueue<T>
先入れ先出し (FIFO) 動作のConcurrentStack<T>
オブジェクト、または後入れ先出し (LIFO) 動作のオブジェクトを指定できます。インターフェイスを実装する任意のコレクション クラスを使用できIProducerConsumerCollection<T>
ます。のデフォルトのコレクション タイプはBlockingCollection<T>
ですConcurrentQueue<T>
。
これには が含まれます。これはConcurrentBag<T>
、ブロッキング同時実行バッグを持つことができることを意味します。IProducerConsumerCollection<T>
では、プレーンコレクションとブロッキング コレクションの違いは何でしょうか? ドキュメントには次のように書かれBlockingCollection
ています(強調は私のものです):
BlockingCollection<T>
IProducerConsumerCollection<T>
インスタンスのラッパーとして使用され、 データが削除可能になるまでコレクションからの削除の試行をブロックできます。同様に、BlockingCollection<T>
を作成して、IProducerConsumerCollection<T>
[...]
リンクされた質問では、これらのことを行う必要がないため、使用すると、使用さBlockingCollection
れない機能のレイヤーが追加されるだけです。
List<T>
シングル スレッド アプリケーションで使用するように設計されたコレクションです。ConcurrentBag<T>
Collections.Concurrent
マルチスレッド環境でコレクションを簡単に使用できるように設計された名前空間のクラスです。ConcurrentCollection を使用すると、他のスレッドによる破損を防ぐためにコレクションをロックする必要がなくなります。特別なロック コードを記述する必要なく、コレクションからデータを挿入または取得できます。BlockingCollection<T>
スレッド間の共有コレクションで新しいデータが利用可能かどうかをチェックする必要をなくすように設計されています。共有コレクションに挿入された新しいデータがある場合、コンシューマー スレッドはすぐに起動します。そのため、通常はwhileループで特定の時間間隔でコンシューマースレッドが新しいデータを利用できるかどうかを確認する必要はありません。
はい、そのために使用できますBlockingCollection
。finishedProxies
次のように定義されます:
BlockingCollection<string> finishedProxies = new BlockingCollection<string>();
アイテムを追加するには、次のように記述します。
finishedProxies.Add(checkResult);
そして、それが完了したら、コンテンツからリストを作成できます。