我在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的一切都无法正常工作..
有什么想法吗?
答案 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);