私はBlockingCollection
生産者消費者パターンに を使用していますが、例外があり、特許を書いていると思います-グーグルでの結果は2つだけです! 期待は「CompleteAddingはコレクションへの追加と同時に使用できない可能性があります」であり、次のようにTryAdd
BlockingCollectionでiが発生した場合に発生します。
public void EnqueueTask(T item)
{
if (!_cancellationTokenSource.IsCancellationRequested)
{
_workerQueue.Add(item);
}
}
これCompleteAdding
は Consumer-Producer ラッパー クラスの破棄時に呼び出されます。
public void Dispose()
{
if (!_IsActive)
return;
_IsActive = false;
_cancellationTokenSource.Cancel();
_workerQueue.CompleteAdding();
// Wait for the consumer's thread to finish.
for (int i = 0; i < _workers.Length; ++i)
{
Task t1 = Task.Factory.StartNew(() =>
{
try
{
if (!_workers[i].Join(4000))
LogWriter.Trace("Failed to join thread", "ThreadFailureOnDispose");
}
catch (Exception ex)
{
OnLogged(ex.Message + ex.StackTrace);
}
});
}
// Release any OS resources.
}
マイクロソフトの誰かがアイデアを得ましたか? キャンセル後、CompleteAdding を呼び出す前にスリープ状態にする必要がありますか?