在另一个完成后运行BackgroundWorker
我想在另一个完成后启动BackgroundWorker
。我不知道如何为它编写代码,所以我没有什么可展示的。在另一个完成后运行BackgroundWorker
我想过写在RunWorkerCompleted
,但这似乎是错误的地方把逻辑启动另一名工人。
我该在哪里以及如何做到这一点?
基本上,我想使用同一个工人,但要做别的事情。就像在第1步中分析文件中的数据一样,在第2步中,在第1步完成后,它应该将解析的数据从内存写入数据库。
如果使用第三方库进行作业调度是可以接受的,请查看Quartz.NET以及它的作业监听器机制http://quartznet.sourceforge.net/tutorial/lesson_7.html。如果你想自己实现它,我会使用一个BackgroundWorker
来执行一组作业,组织成一个责任链,你可以在这里阅读更多关于这个模式http://dofactory.com/Patterns/PatternChain.aspx。
您可以改为使用.NET 4.0 Task类,然后使用Task.ContinueWith排队更多工作。
不幸的是,我只在应用程序将运行的机器上安装了.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)
。
ReportProgress不仅接受整数。接受对象的重载有助于提供丰富的反馈。 – 2012-01-02 17:27:06
你说得对,我查了MSDN,完全错过了过载。答案已更新。 – 2012-01-02 17:51:39
开始另一个BGW没有意义。在第一步完成后,只需要第一个执行step2代码即可。你甚至可以直接调用它的DoWork()方法。 – 2012-01-02 16:41:36