2009-07-29 61 views
2

我已經建立一個Windows服務使用一個計時器,這是不是我想要做的理想。我有一個方法,我想打電話,一旦它結束,我希望它一次又一次地開始。這樣做的最好方法是什麼,你可以給我一個例子。Windows服務循環 - 如何?

+0

我不禁好奇什麼是你想要做一遍又一遍,直到永遠。 – quillbreaker 2009-07-29 15:42:12

+0

我們調查客戶端系統以導入需要成爲活動鏈接的作業,他們不會推送它們,我們必須去獲取它們,並且我們需要在系統上創建的文件的10秒內導入它們 – MartGriff 2009-07-29 15:50:56

+0

是否存在永久連接到這個位置?如果是這樣,一個FileSystemWatcher是可用的...但只有當連接打開,你可以通過UNC訪問驅動器。 – Hooloovoo 2009-07-29 15:53:57

回答

1

你能解釋一下你想完成什麼嗎?

在Service中使用計時器時,您需要使用System.Threading.Timer。

如果你經常循環,那麼你的CPU使用率將會通過屋頂。如果您嘗試監視某個目錄,則可以使用FileSystemWatcher,但如果您的主機未運行Windows,這可能會很麻煩。如果你試圖查詢一個表並得到結果,你可以每隔15秒查看一條新記錄,並且如果存在新記錄,則將該函數標記爲通過布爾值運行,以便如果它在15秒後仍然運行,則不會再次啓動。

我打算給你一個系統服務中定時器的例子。

Private myThreadingTimer As System.Threading.Timer 
    Private blnCurrentlyRunning As Boolean = False 

    Protected Overrides Sub OnStart(ByVal args() As String) 
     Dim myTimerCallback As New TimerCallback(AddressOf OnTimedEvent) 
     myThreadingTimer = New System.Threading.Timer(myTimerCallback, Nothing, 1000, 1000) 
    End Sub 

    Private Sub OnTimedEvent(ByVal state As Object) 
     If Date.Now.Second = 1 Or Date.Now.Second = 15 Or Date.Now.Second = 30 Or Date.Now.Second = 45 Then 
      If Not blnCurrentlyRunning Then 
       blnCurrentlyRunning = True 

       Dim myNewThread As New Thread(New ThreadStart(AddressOf MyFunctionIWantToCall)) 
       myNewThread.Start() 
      End If 
     End If 
    End Sub 

Public Sub MyFunctionIWantToCall() 
    Try 
     'Do Something 
    Catch ex As Exception 
    Finally 
     blnCurrentlyRunning = False 
    End Try 
End Sub 
+0

我的計時器問題是在第一次找到之前的第二次/第三次啓動。但我需要輪詢時間儘可能低,例如2秒這就是爲什麼我問循環。 – MartGriff 2009-07-29 15:53:54

+0

所以你需要實現一個布爾值來知道它當前是否正在運行,以及它當前正在運行的是否不重新執行函數/代碼。基本上和上面一樣。您可以修改代碼,使其每2秒觸發一次,如果您願意,可以在OnTimeEvent函數中添加更多或子句。 – Zman101 2009-07-29 16:16:11

3
private AutoResetEvent m_waitNextExec = new AutoResetEvent(false); 
private int m_execTimer = 1000; //Every second 
private bool m_isRunning = true; 

private void SomeMethod() 
{ 
    while (m_isRunning) 
    { 
     //Do something 

     m_waitNextExec.WaitOne(m_execTimer); 
    } 
} 

此代碼使您對代碼的執行更多的控制。自動重置事件爲您提供了降低執行率的可能性。

如果你想中止執行,你只需要做:

m_isRunning = false; 
m_waitNextExec.Set(); 
+0

這會導致堆棧出現問題嗎?如果全天候運行 – MartGriff 2009-07-29 16:08:21