Представьте себе очередь, содержащую множество заданий, требующих обработки. Ограничение очереди заключается в том, что за раз можно получить только 1 задание, и нет возможности узнать, сколько там заданий. Выполнение заданий занимает 10 секунд и требует длительного ожидания ответов от веб-служб, поэтому не ограничивается процессором.
Если я использую что-то вроде этого
while (true)
{
var job = Queue.PopJob();
if (job == null)
break;
Task.Factory.StartNew(job.Execute);
}
Затем он яростно выталкивает задания из очереди гораздо быстрее, чем успевает их выполнить, у него заканчивается память и он падает на задницу. >.
{
while (!jobs.IsCompleted)
{
var job = jobs.Take();
job.Execute();
}
}
consumer.Start();
}
// Producer to take items of queue and put in blocking collection ready for processing
while (true)
{
var job = Queue.PopJob();
if (job != null)
jobs.Add(job);
else
{
jobs.CompletedAdding()
// May need to wait for running jobs to finish
break;
}
}