c#等待后台工作者完成任务

问题描述 投票:-1回答:3

所以我有一个后台工作人员执行任务,我需要程序等待这个任务完成后再继续,此刻我正在这样做:

while(backgroundwork.IsBusy)
{
    Thread.Sleep(10);
}

然而,当我运行这个程序时,程序停止运行,似乎后台工作程序正在不断运行,但事实并非如此,工作程序中没有循环,并且它之前完成了任务。

我能错过什么?

c# backgroundworker
3个回答
1
投票

你可以使用BackgroundWorker.RunWorkerCompleted事件。您可以等待WaitHandle(如autoresetevent),并通过RunWorkerCompleted事件发出信号。


1
投票

Thread.Sleep用于等待指定的时间,什么都不做。

Async wait用于等待给定的任务完成。

myMethod().wait() - 这里myMethod将是你的异步方法,wait()是c#keyword,它将等待异步以完成该方法。

看看thread.sleep()和异步延迟之间的区别 - Here!!


0
投票

解:

正如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上还有一些更有用的事件。

Backgroundworker events

MSDN provides是如何使用BackgroundWorker的完整示例。你应该看一下。

© www.soinside.com 2019 - 2024. All rights reserved.