在另一个完成后运行BackgroundWorker

在另一个完成后运行BackgroundWorker

问题描述:

我想在另一个完成后启动BackgroundWorker。我不知道如何为它编写代码,所以我没有什么可展示的。在另一个完成后运行BackgroundWorker

我想过写在RunWorkerCompleted,但这似乎是错误的地方把逻辑启动另一名工人。

我该在哪里以及如何做到这一点?

基本上,我想使用同一个工人,但要做别的事情。就像在第1步中分析文件中的数据一样,在第2步中,在第1步完成后,它应该将解析的数据从内存写入数据库。

+2

开始另一个BGW没有意义。在第一步完成后,只需要第一个执行step2代码即可。你甚至可以直接调用它的DoWork()方法。 – 2012-01-02 16:41:36

如果使用第三方库进行作业调度是可以接受的,请查看Quartz.NET以及它的作业监听器机制http://quartznet.sourceforge.net/tutorial/lesson_7.html。如果你想自己实现它,我会使用一个BackgroundWorker来执行一组作业,组织成一个责任链,你可以在这里阅读更多关于这个模式http://dofactory.com/Patterns/PatternChain.aspx

您可以改为使用.NET 4.0 Task类,然后使用Task.ContinueWith排队更多工作。

+0

不幸的是,我只在应用程序将运行的机器上安装了.NET-3.5 ... – 2012-01-02 16:44:33

可能最好使用两个不同的BackgroundWorker组件。在第一个RunWorkerCompleted事件处理程序中启动第二个。这似乎是一种非常合理的做事方式。只是不要试图用一个BackgroundWorker做到这一点。

作为Tudor mentioned,你可以使用Task,但是你会失去BackgroundWorker的便利,它有其熟悉的面向事件的接口,进度报告等等。

从您的描述看来,这些步骤似乎是相关的并且是连续的,所以我将它作为单个BGW执行,其中DoWork执行两个步骤,在解析步骤和写入数据库步骤之间调用ReportProgress

然后,您可以处理在UI线程上运行的ProgressChanged事件,以在分析步骤完成后执行任何逻辑,从而知道工作人员已在写入数据库。

ReportProgress接受一个整数来标识后台任务和可选自定义对象的完成百分比。因此,在您的ProgressChanged处理程序中,您需要具有解释此进度信息的逻辑。在这种情况下,作为一项两步工作,您可以致电ReportProgress(50)

+0

ReportProgress不仅接受整数。接受对象的重载有助于提供丰富的反馈。 – 2012-01-02 17:27:06

+0

你说得对,我查了MSDN,完全错过了过载。答案已更新。 – 2012-01-02 17:51:39