我使用BlockingCollection
作爲生產者消費者模式,我得到了一個例外,我認爲在它上面寫了一個專利 - 在google中只有兩個結果! 的厚望是「CompleteAdding可以不被添加到集合同時使用」和跟隨它發生在我TryAdd
上個BlockingCollection:對於.net 4.0上BlockingCollection的非常特殊的例外
public void EnqueueTask(T item)
{
if (!_cancellationTokenSource.IsCancellationRequested)
{
_workerQueue.Add(item);
}
}
的CompleteAdding
是呼籲消費者,生產者包裝類的Dispose :
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之前睡覺嗎?
什麼是異常的類型?該文檔說'Add'(和'TryAdd')會在'CompleteAdding'被調用後嘗試添加一個項目時拋出'InvalidOperationException'。你的描述不太清楚,但如果你在'Add'調用中遇到異常,我懷疑就是這樣。 – 2013-07-31 00:08:35