Следующий код никогда не возвращается. Отладка показывает, что queue.IsCompleted возвращает false, даже когда очередь пуста. Я что-то пропустил?queue.IsCompleted возвращает false, даже если очередь пуста?
var workers = new Task[1];
using (var queue = new BlockingCollection<QueuePayload>(20))
{
workers[0] = Task.Run(() => Consume(queue));
queue.Add(new QueuePayload{....});
Task.WaitAll(workers);
}
void Consume(BlockingCollection<QueuePayload> queue))
{
while (!queue.IsCompleted)
{
var i = new QueuePayload();
try
{
i = queue.Take();
}
catch (InvalidOperationException)
{
break;
}
......
Вместо 'while (! Queue.IsCompleted) {i = queue.Take(); ... 'Я нахожу, что намного проще сделать просто' foreach (var i в queue.GetConsumingEnumerable()) {... ' –
Итак, если вы добавите' queue.CompleteAdding() 'после последней' queue.Add (new QueuePayload {.....}) 'все еще ведет себя так? –
Я следовал примерам в MSDN. Возможно, они должны обновить эти примеры. – ca9163d9