如何等待BackgroundWorker完成运行另一个BackgroundWorker(C#)?

dgl*_*s61 1 c# backgroundworker autoresetevent waitone

首先,我还是初学者,所以如果你有耐心,我会很感激:)

我今天一直在为此苦苦挣扎.

问题是,我想运行三个不同的背景工作者.但我想等到一个人完成下一个的运行,依此类推.

每个背景工作者都需要时间来完成.长话短说,问题是,我正在使用WaitOne(),所以每当前面的背景工作者告诉我它已经完成时,我就可以开始运行新的,但是UI线程一直在冻结,直到三个后台工作者完成.

我正在设置一个不同的AutoResetEvent,它是一个负责整个等待和运行的东西.

这是代码:

AutoResetEvent _resetRIEvent = new AutoResetEvent(false);
AutoResetEvent _resetHEvent = new AutoResetEvent(false);
AutoResetEvent _resetSEvent = new AutoResetEvent(false);

await Task.Run(() => bgwTestResInd.RunWorkerAsync());
_resetRIEvent.WaitOne();

await Task.Run(() => bgwTestHipot.RunWorkerAsync());
_resetHEvent.WaitOne();

await Task.Run(() => bgwTestSurge.RunWorkerAsync());
_resetSEvent.WaitOne();

MessageBox.Show("Im done for real.");
Run Code Online (Sandbox Code Playgroud)

此外,是否允许这样做?

private void bgwTestResInd_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    _resetRIEvent.Set();
}


private void bgwTestHipot_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    _resetHEvent.Set();
}


private void bgwTestSurge_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    _resetSEvent.Set();
}
Run Code Online (Sandbox Code Playgroud)

Ser*_*rvy 5

而不是创建后台工作者,然后使用设计的任务和同步原语混合来在不同时间启动工作人员,只需从头到尾使用TPL来完成整个事情:

await Task.Run(() => TheWorkThatTheFirstBGWWasDoing());
await Task.Run(() => TheWorkThatTheSecondBGWWasDoing());
await Task.Run(() => TheWorkThatTheThirdBGWWasDoing());
Run Code Online (Sandbox Code Playgroud)

或者,如果所有操作都是CPU绑定工作,您只需使用一次调用即可Task.Run:

await Task.Run(() =>
{
    TheWorkThatTheFirstBGWWasDoing());
    TheWorkThatTheSecondBGWWasDoing());
    TheWorkThatTheThirdBGWWasDoing());
});
Run Code Online (Sandbox Code Playgroud)

完成.

如果你真的必须使用后台工作者(没有真正的理由,但无论如何),那么你需要做的就是调用RunWorkerAsync它需要等待的BGW完成的处理程序,或者更好的是,只需要一个BGW完成第一个工作,然后完成第二个工作需要做的工作,然后完成第三个工作需要做的工作.