я использую BlockingCollection
для шаблона Producer Consumer, и у меня есть исключение, я думаю написать на него патент - только два результата в google! ожидается, что «CompleteAdding не может использоваться одновременно с добавлениями в коллекцию», и это происходит, когда я TryAdd
в th BlockingCollection следующим образом:
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.
}
У кого-нибудь из Microsoft есть идея? я должен спать после отмены и до вызова CompleteAdding?
Add
(иTryAdd
) выдастInvalidOperationException
, если вы попытаетесь добавить элемент после вызоваCompleteAdding
. Ваше описание не слишком ясно, но если вы получаете исключение при вызовеAdd
, я подозреваю, что это так. - person Jim Mischel   schedule 31.07.2013