运行方法的服务中的每一个指定的时间不重复(Run method every specified ti

2019-10-21 14:39发布

我有一个Windows服务,如下图所示:

Protected Overrides Sub OnStart(ByVal args() As String)
    Dim timer As System.Timers.Timer = New System.Timers.Timer()
    timer.Interval = 1000       '1 sec
    AddHandler timer.Elapsed, AddressOf Me.OnTimer
    timer.Start()
End Sub

Private Sub OnTimer(sender As Object, e As Timers.ElapsedEventArgs)
    Dim Time As String = DateTime.Now.ToString("hh:mm:ss tt")
    If Time = "01:58:15 PM" Or Time = "02:42:15 PM" Or Time = "02:43:15 PM" _
            Or Time = "03:44:15 PM" Or Time = "06:00:15 PM" _
            Or Time = "12:00:15 AM" Or Time = "05:00:15 AM" Then
        Dim path As String = Application.StartupPath & "\test.log"
        Dim strFile As String = String.Format(path, _
                DateTime.Today.ToString("dd-MMM-yyyy"))
        File.AppendAllText(strFile, String.Format("Message at-- {0}{1}", _
                DateTime.Now, Environment.NewLine))
    End If
End Sub

你能向我解释为什么我有两个输入下午3点44分15秒? 我想计时器事件的OnTimer被搁置,直到前面的计时器触发作业完成,然后时间会有所不同,它不会同一时间内犹豫。 怎么了?

Message at-- 1/13/2015 3:44:15 PM
Message at-- 1/13/2015 3:44:15 PM
Message at-- 1/14/2015 12:00:15 AM
Message at-- 1/14/2015 5:00:15 AM

对于进一步的讨论:

Private Sub OnTimer(sender As Object, e As Timers.ElapsedEventArgs)
    RemoveHandler timer.Elapsed, AddressOf Me.OnTimer
    Dim Time As String = DateTime.Now.ToString("hh:mm:ss tt")
    If Time = "01:58:15 PM" Or Time = "02:42:15 PM" Or Time = "02:43:15 PM" _
            Or Time = "03:44:15 PM" Or Time = "06:00:15 PM" _
            Or Time = "12:00:15 AM" Or Time = "05:00:15 AM" Then
        Dim path As String = Application.StartupPath & "\test.log"
        Dim strFile As String = String.Format(path, _
                DateTime.Today.ToString("dd-MMM-yyyy"))
        File.AppendAllText(strFile, String.Format("Message at-- {0}{1}", _
                DateTime.Now, Environment.NewLine))
    End If
    AddHandler timer.Elapsed, AddressOf Me.OnTimer
End Sub

Answer 1:

所显示的时间被截断,和定时器是不是所有的令人惊讶的精确(分辨率在几十毫秒内不时地测定,没关系,可以与多任务处理进来的延迟)。 因此,它可能只是在计时器事件触发了两次,几乎是第二分开的情况下,但在同一个显示第二。

此外,在所有的一前一事件处理程序将完成其工作,但只要该事件在同一线程上发射难保。 这就是说,它不是很难无意中允许与喜欢旧的东西折返事件DoEvents 。 而且,事实上,类甚至设计运行多线程,线程池,上线有可能触发事件,即或多或少慎之又慎,除非SynchronizingObject供应。 (这其中是不是。)

如果要检查你的系统的分辨率,你必须挖掘到的文档对于给出的示例Interval

我建议你专门跟踪是否给定的时间尚未在当天的活动达到了,如果没有,让事件经过。 显然,以防万一同步访问这个,可能使用SynchronizingObjectTimer



文章来源: Run method every specified time within a service without repeating