50
4

4 に答える 4

82

確かに 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れない機能のレイヤーが追加されるだけです。

于 2013-03-14T09:20:16.433 に答える
29
  • List<T>シングル スレッド アプリケーションで使用するように設計されたコレクションです。

  • ConcurrentBag<T>Collections.Concurrentマルチスレッド環境でコレクションを簡単に使用できるように設計された名前空間のクラスです。ConcurrentCollection を使用すると、他のスレッドによる破損を防ぐためにコレクションをロックする必要がなくなります。特別なロック コードを記述する必要なく、コレクションからデータを挿入または取得できます。

  • BlockingCollection<T>スレッド間の共有コレクションで新しいデータが利用可能かどうかをチェックする必要をなくすように設計されています。共有コレクションに挿入された新しいデータがある場合、コンシューマー スレッドはすぐに起動します。そのため、通常はwhileループで特定の時間間隔でコンシューマースレッドが新しいデータを利用できるかどうかを確認する必要はありません。

于 2016-10-31T14:25:24.810 に答える
3

はい、そのために使用できますBlockingCollectionfinishedProxies次のように定義されます:

BlockingCollection<string> finishedProxies = new BlockingCollection<string>();

アイテムを追加するには、次のように記述します。

finishedProxies.Add(checkResult);

そして、それが完了したら、コンテンツからリストを作成できます。

于 2013-03-14T03:57:08.413 に答える