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)
而不是创建后台工作者,然后使用设计的任务和同步原语混合来在不同时间启动工作人员,只需从头到尾使用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完成第一个工作,然后完成第二个工作需要做的工作,然后完成第三个工作需要做的工作.
归档时间: |
|
查看次数: |
497 次 |
最近记录: |