所以我有一个后台工作人员执行任务,我需要程序等待这个任务完成后再继续,此刻我正在这样做:
while(backgroundwork.IsBusy)
{
Thread.Sleep(10);
}
然而,当我运行这个程序时,程序停止运行,似乎后台工作程序正在不断运行,但事实并非如此,工作程序中没有循环,并且它之前完成了任务。
我能错过什么?
你可以使用BackgroundWorker.RunWorkerCompleted事件。您可以等待WaitHandle(如autoresetevent),并通过RunWorkerCompleted事件发出信号。
Thread.Sleep用于等待指定的时间,什么都不做。
Async wait用于等待给定的任务完成。
myMethod().wait()
- 这里myMethod将是你的异步方法,wait()
是c#keyword,它将等待异步以完成该方法。
看看thread.sleep()和异步延迟之间的区别 - Here!!
正如Heinzi在评论中所述,您应该只使用RunWorkerCompleted事件。
Here是“如何使用backgroundworker runworkercompleted事件”的一个很好的例子你永远不会“等待”任务/线程完成,但你可以“等待”等待句柄或让线程在此期间做其他事情
在您持有Backgroundworker实例的类中,您可以简单地附加到已完成的事件和您的罚款。
删除该循环,其中包含Thread.Sleep()
.
private void WorkerExample() {
BackgroundWorker bw = new BackgroundWorker();
bw.RunWorkerCompleted += OnWorkerCompleted; //listen for that event by attaching a handler
bw.RunWorkerAsync();
}
//This is the EventHandler
private void OnWorkerCompleted(object sender, RunWorkerCompletedEventArgs runWorkerCompletedEventArgs) {
//This method is called, when the worker finished his job
}
BackgroundWorker上还有一些更有用的事件。
MSDN provides是如何使用BackgroundWorker的完整示例。你应该看一下。