共享和同步对象b / w BackgroundWorker和主线程

时间:2014-08-08 09:47:54

标签: c# multithreading backgroundworker

不重复 Sharing objects between a BackgroundWorker and main thread

我有BackgroundWorker处理在主线程管理的队列(读取数组)。当BackgroundWorker已经开始处理队列时,主线程应该能够更新队列,并且此更新应该对BackgroundWorker可见。

如果队列作为参数传递给RunWorkerAsync(),它将与任何更改隔离,直到执行返回主线程(RunWorkerCompletedProgressChanged

我使用BackgroundWorker在正确的位置吗?如果是,我正在寻找的同步是否可以实现?如果不是,还有其他选择吗?

1 个答案:

答案 0 :(得分:0)

使用专为此任务设计的BlockingCollection<T>,并且是线程安全的。它在引擎盖下使用ConcurrentQueue<T>

在后台主题:

foreach(var item in theQueue.GetConsumingEnumerable())
{
    // Process item
}

在主线上:

theQueue.Add(item1);
theQueue.Add(item2); // etc
theQueue.CompleteAdding();

当您从后台线程中读取队列时,可以对主线程中的队列进行更改。 foreach循环将处理所有元素,它将在队列为空时阻止等待新元素,并在它处理完所有内容时退出(由CompleteAdding调用发出信号)。