不重复 Sharing objects between a BackgroundWorker and main thread
我有BackgroundWorker
处理在主线程管理的队列(读取数组)。当BackgroundWorker
已经开始处理队列时,主线程应该能够更新队列,并且此更新应该对BackgroundWorker
可见。
如果队列作为参数传递给RunWorkerAsync()
,它将与任何更改隔离,直到执行返回主线程(RunWorkerCompleted
或ProgressChanged
)
我使用BackgroundWorker
在正确的位置吗?如果是,我正在寻找的同步是否可以实现?如果不是,还有其他选择吗?
答案 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
调用发出信号)。