共享和同步对象b/w后台工作线程和主线程
本文关键字:线程 工作 后台 同步 对象 共享 | 更新日期: 2023-09-27 18:17:00
不重复在BackgroundWorker和主线程之间共享对象
我有一个BackgroundWorker
处理队列(读取数组),这是在主线程管理。当BackgroundWorker
已经开始处理队列时,主线程应该能够更新队列,并且这个更新应该对BackgroundWorker
可见。
如果队列作为参数传递给RunWorkerAsync()
,它将与任何更改隔离,直到执行返回主线程(在RunWorkerCompleted
或ProgressChanged
)
我在正确的地方使用BackgroundWorker
吗?如果是,我正在寻找的同步是否可以实现?如果没有,还有其他选择吗?
使用专门为此任务设计的BlockingCollection<T>
,并且是线程安全的。它在引擎盖下使用ConcurrentQueue<T>
。
在后台线程中:
foreach(var item in theQueue.GetConsumingEnumerable())
{
// Process item
}
在主线程中:
theQueue.Add(item1);
theQueue.Add(item2); // etc
theQueue.CompleteAdding();
当你从后台线程读取队列时,你可以在主线程中对队列进行更改。foreach
循环将处理所有元素,当队列为空时,它将阻塞等待新元素,当它处理完所有元素时(由CompleteAdding
调用发出信号),它将退出。