2015-01-14 1 views
1

을 반복하지 않고 서비스 내의 모든 지정된 시간 : 나는 오후 3시 44분 15초에 대한 두 개의 입력을 가지고 왜실행 방법 나는 같은 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 

당신이 나에게 설명 할 수 있습니까? 나는 타이머 이벤트 OnTimer가 이전 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 

답변

1

표시되는 시간은 잘린이며, 타이머는 모든되지 않습니다 놀라 울 정도로 정확한 그 (해상도는 때때로 지연을 신경 쓰지, 수십 밀리 단위로 측정된다 멀티 태스킹으로 들어올 수 있습니다.) 따라서 타이머 이벤트가 두 번, 거의 1 초 간격으로 발생하지만 동일한 표시된 초 내에 타이머 이벤트가 발생한 경우 일 수 있습니다.

또한 동일한 스레드에서 이벤트가 발생하는 경우를 제외하고 이전 이벤트 핸들러가 작업을 완료한다는 보장은 없습니다. 다시 말하면 올드 DoEvents과 같은 물건으로 실수로 재진입 이벤트를 허용하는 것이 어렵지 않습니다. 사실,이 클래스는 스레드 풀 스레드에서 멀티 스레드, 잠재적으로 실행 이벤트를 실행하도록 설계되었습니다 (예 : SynchronizingObject이 제공되지 않는 한 다소 비싸지 않음). (어느 쪽이 아니 었는지)

시스템의 해상도를 확인하려면 Interval의 문서에 나와있는 예제를 조사해야합니다.

당일 이벤트 일정에 아직 도달했는지 여부를 구체적으로 추적하고 그렇지 않은 경우 이벤트가 통과하도록 허용하는 것이 좋습니다. 분명히이 경우 액세스를 동기화하십시오. 아마도 TimerSynchronizingObject을 사용하십시오.

+0

OnTimer에 도달하고 해당 작업을 수행중인 경우 언급 된 작업 중에 time_elapsed 이벤트가 보류 중이거나 이미 실행중인 경우에도 time_Elapsed로 다시 이동합니까? – unknown

+1

@unknown : 문서별로 후자입니다. 기본적으로 설정되지 않은'SynchronizingObject' 속성을 사용하지 않는 한 일반적으로 이중 이벤트를 피하려고 시도하지 않습니다. 따라서 규범은 핸들러가해야 할 필요성에 특별히주의하지 않는 한 재진입하도록 설계되어야한다는 것입니다. 내 코드에 따라 –

+0

- 이벤트 처리기 (OnTimer)는 특정 시간에 한 번 도달 할 수 있습니까? 그리고 시간 간격은 계속 진행 중이며 이미 점유 된 경우 OnTimer로 이동하지 않습니다. 그게 내가 쓴 모든 것이 맞습니까? – unknown

관련 문제