在我的 winforms 应用程序中,我有一个包含对象的队列:
Queue<MyObj> _queuedRows = new Queue<MyObj>();
对于每个对象,我必须启动一个单独的后台工作程序来完成一些耗时的工作。
private void DoAll(List<MyObj> lst)
{
foreach (MyObj o in lst)
{
_queuedRows.Enqueue(o);
}
while (_queuedRows.Any())
DoSingle();
}
private void DoSingle()
{
if (!isCancelPending())
{
if (_queuedRows.Any())
{
MyObj currentObj = _queuedRows.Dequeue();
InitBackgroundWorker(currentObj);
}
}
}
private void InitBackgroundWorker(MyObj currentObj)
{
BackgroundWorker _worker = new BackgroundWorker();
_worker.WorkerSupportsCancellation = true;
_worker.WorkerReportsProgress = true;
_worker.DoWork += new DoWorkEventHandler(worker_DoWork);
_worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
if (!_worker.IsBusy && currentObj != null)
_worker.RunWorkerAsync(currentObj);
}
我的问题是,在调用 RunWorkerAsync 之后,执行跳转到 while 的下一次迭代(这是合乎逻辑的,因为 worker 正在运行异步并且它允许下一次迭代发生)。
我真正需要做的是告诉应用程序以某种方式等待,直到后台工作人员完成工作,然后它才应该通过继续调用 DoSingle() 来开始下一次迭代。
我应该对 _queuedRows 对象或类似对象应用锁定吗?谢谢,