我如何等待一个工作进程完成但又限制它的时间呢?

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