如何等待工作进程完成,同时限制完成的时间?



我正在VB.Net中编写一个Windows服务,该服务将发送到一些设备和信息的数据日志点。我正在使用后台工作程序来执行此操作,因此服务本身仍然具有响应性。我有一个计时器,它每秒运行一次,并检查当前时间的分钟分量。每次分钟组件发生变化时,我都会检查哪些设备需要检查,有些是每分钟检查一次,有些是每隔5分钟检查一次等。这些过程可能需要几秒钟或一分钟以上的时间(如果工作进程尚未运行,我只会重新运行它,如果最后一个进程的时间比数据检索间隔长,我会记录错误(。

在我为该服务举办的OnStop活动中,我想确保所有员工都关门。我在worker上调用CancelAsync,worker检查取消,希望能干净地退出(即,检查取消,如果错误,则检索数据,将数据保存到数据库中,循环(。

我的问题是,我不想使用睡眠语句,因为它会锁定所有内容,但我也不希望服务永远不会关闭。例如,我目前有这样一个:

Protected Overrides Sub OnStop()
' Add code here to perform any tear-down necessary to stop your service.
My.Application.Log.WriteEntry("ServiceABC shutting down for device " & DeviceID)
ServiceTimer.enable = false
If DataRetrievalBackgroundWorker.IsBusy Then
DataRetrievalBackgroundWorker.CancelAsync()
Dim x As Integer = 0
While ((DataRetrievalBackgroundWorker.IsBusy) Or (x < 15))
Threading.Thread.Sleep(1000)
x += 1
End While
End If
End Sub

这应该工作,因为后台工作程序在另一个线程上,对吗?有更好的方法来处理这个问题吗?

你很接近,如果你不想睡觉(1000(并把东西锁起来,就做一个睡眠(1(。

'Dim x As Integer = 0
'While ((DataRetrievalBackgroundWorker.IsBusy) Or (x < 15))
'    Threading.Thread.Sleep(1000)
'    x += 1
'End While
Dim T As Date = Now.AddSeconds(15)
While DataRetrievalBackgroundWorker.IsBusy Or Now() < T
Threading.Thread.Sleep(1)
Application.DoEvents()
End While

最新更新