3

Parallel.foreachを使用して、ブロックしているコレクションのアイテムを使用しています。これが行われると、デフォルトでパーティション分割が発生することを私は知っています。これがBlockingCollectionのロック/ブロックにどのように影響するかをもっと理解したいと思います。スレッドが消費しているときに、ブロッキングコレクションの追加操作がブロックされる可能性がある場合はありますか?

ありがとう

4

1 に答える 1

3

可能性があります(方法:BlockingCollectionから個別にアイテムを追加および取得する方法を参照)

この最初の例は、コレクションが一時的に空(取得時)または最大容量(追加時)のいずれかであるか、指定されたタイムアウト期間が経過した場合に操作がブロックされるように、アイテムを追加および取得する方法を示しています。最大容量でのブロックは、コンストラクターで指定された最大容量でBlockingCollectionが作成された場合にのみ有効になることに注意してください。

したがって、コレクションが最大容量の場合、追加はブロックされます。

foreachループでアイテムを消費する場合、アイテムの追加はこの間にブロックされませんが、注意する必要があることがいくつかあります。

  1. アイテムがプロデューサースレッドによって追加されたのと同じ順序で列挙されるという保証はありません。
  2. この種の列挙(foreach)は、正確な時点でのコレクションのスナップショットを表すことを理解することが重要です。ループの実行中に他のスレッドがアイテムを同時に追加または削除している場合、ループはコレクションの実際の状態を表していない可能性があります。
于 2012-06-21T13:25:20.120 に答える