классический шаблон производителя-потребителя с использованием blockingcollection и tasks .net 4 TPL

См. ниже псевдокод

//Single or multiple Producers produce using below method
    void Produce(object itemToQueue)
    {
        concurrentQueue.enqueue(itemToQueue);
        consumerSignal.set;
    }

    //somewhere else we have started a consumer like this
    //we have only one consumer
    void StartConsumer()
    {
        while (!concurrentQueue.IsEmpty())
        {
            if (concurrentQueue.TrydeQueue(out item))
            {
                //long running processing of item
            }
        }
        consumerSignal.WaitOne();
    }

Как мне портировать этот шаблон, который я использовал с незапамятных времен для использования задач, созданных с помощью taskfactory, и новых сигнальных функций сети 4. Другими словами, если кто-то напишет как будет выглядеть этот шаблон с использованием сети 4? Псевдокод в порядке. Я уже использую .net 4 concurrentQueue, как вы можете видеть. Как мне использовать задачу и, возможно, использовать более новый механизм сигнализации, если это возможно. спасибо

Решение моей проблемы ниже благодаря Джону / Дэну. Сладкий. Нет ручной сигнализации или циклов типа while (true) или while (itemstoProcess), как в старые времена

//Single or multiple Producers produce using below method
 void Produce(object itemToQueue)
 {
     blockingCollection.add(item);
 }

 //somewhere else we have started a consumer like this
 //this supports multiple consumers !
 task(StartConsuming()).Start; 

 void StartConsuming()
 {
     foreach (object item in blockingCollection.GetConsumingEnumerable())
     {
                //long running processing of item
     }
 }

cancellations are handled using cancel tokens
19
задан Gullu 29 June 2011 в 13:07
поделиться