3

別のスレッドがコレクションを使用しているため、呼び出すときIProducerConsumerCollection<T>.TryAdd(<T>)、またはIProducerConsumerCollection<T>.TryTake(out <T>)これらが失敗することはありますか?

それとも、他のスレッドがコレクションを終了した後でも、Add するスペースや Take する何かがある場合、常に true を返すということですか?

ここには何も表示されません: http://msdn.microsoft.com/en-us/library/dd287147.aspx

4

2 に答える 2

6

理論的には、コレクションは何らかの理由で取得/追加要求を拒否できますが、私が知っている唯一の理由はAdd、コレクションが容量に達したTakeために失敗したことと、コレクションが空であるために失敗したことです。

コレクションは最初から複数のスレッドから使​​用できるように設計されています。そのため、アイテムが残っている場合、2 つのスレッドTakeが同時にしようとしても、アイテムと戻り値の両方を取得する必要がありますtrue

于 2013-01-10T11:33:28.493 に答える
0

たとえば、BlockingCollection <T>境界およびブロック機能を備えたインターフェイスの高レベルの抽象化 (インターフェイスは実装していません) は、次のいずれかをスローする可能性があります。

  • コレクションが破棄されると、 TryAdd(T)またはTryTake(T ) でObjectDisposedExceptionがます。
  • 追加の完了としてマークされている場合、 TryAdd(T)でInvalidOperationExceptionが2 つのプロデューサーからコレクションに値を追加する状況を考えてみてください。1 つはコレクションを完了としてマークし、もう 1 つはコレクションに追加しようとします。
于 2013-01-10T11:51:04.010 に答える