我如何等待一个工作进程完成但又限制它的时间呢?
How do I wait for a worker process to finish but also limit it's time to do so?
我正在 VB.Net 中编写一个 Windows 服务,它将输出到某些设备和数据记录点的信息。我正在使用后台工作者来执行此操作,因此服务本身仍然可以响应。我有一个每秒运行一次的计时器,并检查当前时间的分钟部分。每次分钟组件更改时,我都会检查哪些设备需要检查,有些是每分钟一次,有些是每 5 次,有些是每 10 次,等等。这些过程可能需要几秒钟或一分钟以上(如果不是,我只会重新运行 worker已经 运行 如果最后一个过程花费的时间比数据检索间隔长,则记录错误。
在我的服务 OnStop 事件中,我想确保工作人员全部关闭。我在 worker 上调用 CancelAsync 并且 worker 检查取消以希望干净地退出(即检查取消,如果 false 检索数据,将数据保存到数据库,循环)。
我的问题是我不想使用睡眠语句,因为它会锁定所有内容,但我也不希望该服务永远不会关闭。例如,我目前有这个:
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
我正在 VB.Net 中编写一个 Windows 服务,它将输出到某些设备和数据记录点的信息。我正在使用后台工作者来执行此操作,因此服务本身仍然可以响应。我有一个每秒运行一次的计时器,并检查当前时间的分钟部分。每次分钟组件更改时,我都会检查哪些设备需要检查,有些是每分钟一次,有些是每 5 次,有些是每 10 次,等等。这些过程可能需要几秒钟或一分钟以上(如果不是,我只会重新运行 worker已经 运行 如果最后一个过程花费的时间比数据检索间隔长,则记录错误。
在我的服务 OnStop 事件中,我想确保工作人员全部关闭。我在 worker 上调用 CancelAsync 并且 worker 检查取消以希望干净地退出(即检查取消,如果 false 检索数据,将数据保存到数据库,循环)。
我的问题是我不想使用睡眠语句,因为它会锁定所有内容,但我也不希望该服务永远不会关闭。例如,我目前有这个:
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