队列到ConcurrentQueue

时间:2013-02-20 22:24:45

标签: c# parallel-processing queue backgroundworker

我在C#(4.0)中有一个常规的Queue对象,而我正在使用访问此队列的BackgroundWorkers。

我使用的代码如下:

   do
    {
        while (dataQueue.Peek() == null // nothing waiting yet 
            && isBeingLoaded == true // and worker 1 still actively adding stuff
        )
            System.Threading.Thread.Sleep(100);

        // otherwise ready to do something: 
        if (dataQueue.Peek() != null) // because maybe the queue is complete and also empty 
        {
            string companyId = dataQueue.Dequeue();
            processLists(companyId);
            // use up the stuff here //
        } // otherwise nothing was there yet, it will resolve on the next loop.
    } while (isBeingLoaded == true // still have stuff coming at us 
           || dataQueue.Peek() != null);   // still have stuff we haven’t done

但是,我想在处理线程时我应该使用ConcurrentQueue。 我想知道是否有如何在上面的Do While循环中使用ConcurrentQueue的示例?

我尝试使用TryPeek的一切都无法正常工作..

有什么想法吗?

1 个答案:

答案 0 :(得分:5)

您可以使用BlockingCollection<T>作为生产者 - 消费者队列。

我的回答对你的架构做了一些假设,但你可以根据自己的意愿塑造它:

public void Producer(BlockingCollection<string> ids)
{
    // assuming this.CompanyRepository exists
    foreach (var id in this.CompanyRepository.GetIds())
    {
        ids.Add(id);
    }

    ids.CompleteAdding(); // nothing left for our workers
}

public void Consumer(BlockingCollection<string> ids)
{
    while (true)
    {
       string id = null;
       try
       {
           id = ids.Take();
       } catch (InvalidOperationException) {
       }

       if (id == null) break;

       processLists(id);
    }
}

您可以根据需要增加消费者数量:

var companyIds = new BlockingCollection<string>();
Producer(companyIds);

Action process = () => Consumer(companyIds);

// 2 workers
Parallel.Invoke(process, process);