gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 21:05:08 25 4
gpt4 key购买 nike

首先,我还是个初学者,如果您能耐心一点,我将不胜感激:)

今天我一直在为这件事绞尽脑汁。

问题是,我想运行三个不同的后台程序。但是我想等到一个运行完再运行下一个,依此类推。

每个后台 worker 都需要时间来完成。长话短说,问题是,我正在使用 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.");

另外,是否允许这样做?

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();
}

最佳答案

与其创建后台工作人员,然后使用人为的混合任务和同步原语在不同时间启动工作人员,不如从头到尾使用 TPL 来完成整个工作:

await Task.Run(() => TheWorkThatTheFirstBGWWasDoing());
await Task.Run(() => TheWorkThatTheSecondBGWWasDoing());
await Task.Run(() => TheWorkThatTheThirdBGWWasDoing());

或者,如果所有操作都是 CPU 密集型工作,您可以简单地调用 Task.Run:

await Task.Run(() =>
{
TheWorkThatTheFirstBGWWasDoing());
TheWorkThatTheSecondBGWWasDoing());
TheWorkThatTheThirdBGWWasDoing());
});

完成。

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

关于c# - 如何等待 BackgroundWorker 完成运行另一个 BackgroundWorker (C#)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41708245/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com