我的班级会监视传入文件的目录。它使用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?
答案 0 :(得分:0)
如果你想从轨道上解决这个问题,可以在某个地方放置一个AutoResetEvent(false)
,你的BGW的最后一个任务应该是evt.Set()
,你的主线程可以evt.WaitOne(0)
来查询状态。如果有可能同时运行多个BGW,则需要一些数据结构来跟踪哪个ARE与哪个BGW相关联。
更大的投资将转向纯生产者 - 消费者设计,其中包括队列(您已经在表单中)和消费者线程,以使工作项出列并处理它们。