检测BackgroundWorker何时完成其工作?根据具体情况,需要重新运行

时间:2018-04-03 07:28:39

标签: vb.net multithreading asynchronous backgroundworker filesystemwatcher

我的班级会监视传入文件的目录。它使用FileSystemWatcher对象执行此操作,仅监控FSW的{​​{1}}个事件。

Created事件中,我开始了一个潜在的耗时过程(需要文件反序列化,使用我的类向客户端发送事件,其中可能发生各种各样的事情)。因此,我启动一个Created对象来完成所有这些工作,最终最终导致收到的文件被删除。

但是,在所有这些工作中,可能会出现新文件。在我检查的BackgroundWorker事件中,如果Created仍然忙,如果是,我只是将完全限定的名称存储在队列中以供以后使用。

BGW

但是,当Public Sub New(Path As String) FSM = New FileSystemWatcher With FSW .Path = Path AddHandler .Created, AddressOf pFileArrived End With BGW = New BackgroundWorker With BGW .WorkerReportsProgress = False .WorkerSupportsCancellation = False AddHandler .DoWork, AddressOf BGW_DoWork AddHandler .RunWorkerCompleted, AddressOf BGW_RunWorkerCompleted End With End Sub Private Sub pFileArrived(sender As Object, e As FileSystemEventArgs) pNotifyClient(e.FullPath) End Sub Private Sub pNotifyClient(sFullPath As String) If Not BGW.IsBusy Then BGW.RunWorkerAsync(sFullPath) Else MyQueue.Enqueue(sFullPath) End If End Sub Private Sub BGW_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs) '... End Sub 完成时,我该怎么知道?

我知道,有BGW事件。但是,此事件是从仍然存在的真实RunWorkerCompleted实例触发的,因此我无法继续,只需从事件处理程序中再次调用它。

BGW

做这些事情的正确方法是什么?初始化计时器确实浮现在脑海中,但它似乎并不正确。 (我应该花多少时间?我应该循环Private Sub BGW_RunWorkerCompleted(sender As Object, e As RunWorkerCompletedEventArgs) 'This won't work. If MyQueue.Count > 0 Then BGW.RunWorkerAsync(MyQueue.Dequeue) End If End Sub 线程结束吗?)

或者我应该考虑另一种方法而不是调用BGW?

1 个答案:

答案 0 :(得分:0)

如果你想从轨道上解决这个问题,可以在某个地方放置一个AutoResetEvent(false),你的BGW的最后一个任务应该是evt.Set(),你的主线程可以evt.WaitOne(0)来查询状态。如果有可能同时运行多个BGW,则需要一些数据结构来跟踪哪个ARE与哪个BGW相关联。

更大的投资将转向纯生产者 - 消费者设计,其中包括队列(您已经在表单中)和消费者线程,以使工作项出列并处理它们。