2015-05-21 111 views
2

我在VB.NET中創建了Windows服務。 OnStart創建一個工作線程並返回。工作線程啓動正常並嘗試連接到數據庫。如果建立連接,則線程進入無限循環,這是預期的行爲。Windows服務:如何在工作線程停止時觸發OnStop

Dim _shutdown As Boolean = False 
Private _oPollingThread As Thread 

Protected Overrides Sub OnStart(ByVal args() As String) 
    _oPollingThread = New Thread(New System.Threading.ThreadStart(AddressOf PollProcess)) 
    _oPollingThread.Start() 
End Sub 

如果服務被手動關閉(由Windows用戶進入服務並單擊停止),調用OnStop設置一個布爾值;工作線程看到這個併成功關閉它,OnStop加入,服務停止。都好。

Protected Overrides Sub OnStop() 
    _shutdown = True 

    ' Allow poll process to shut down gracefully (give it up to ten seconds...) 
    Dim shutdownCount As Integer = 0 

    Do While _oPollingThread.Join(1000) = False And shutdownCount < 10 
     shutdownCount = shutdownCount + 1 
    Loop 

    If _oPollingThread.IsAlive = True Then 
     _oPollingThread.Abort() 
    End If 

End Sub 

問題是,如何讓服務停止,如果工作線程不連接到數據庫?一旦工作線程終止(而不是進入其無限循環),Windows服務將保持活動狀態,並且OnStop不會運行。

+1

你可以使用背景工作嗎?它完成後會引發一個RunWorkerCompleted事件,所以你只需要一個處理該事件的子組件。 http://stackoverflow.com/questions/5551258/c-net-how-to-alert-program-that-the-thread-is-finished-event-driven –

+0

這工作。謝謝,Tony Hinkle。 – user3076228

回答

0

嗯,我認爲Tony Hinkle可能會在事件的正確軌道上,但我不確定你需要BackgroundWorker。你能否聲明由工作者線程產生的WorkerStopped事件?然後服務可以有一個處理它的Sub並停止服務。

它會是這個樣子:

Public Class WinService 
    '...OnStart(), OnStop()... 

    Dim _shutdown As Boolean = False 
    Private _oPollingThread As Thread 
    Private Event WorkerStopped(sender As Object, e As EventArgs) 

    Private Sub PollProcess() 
     '...Attempt to connect to db... 

     'See if attempt was successful, raise event if not. 
     If databaseConnectionFailed Then 
      RaiseEvent WorkerStopped(Me, Nothing) 'Could pass back data (error msg?) in EventArgs if desired 
     Else 
      'Connected to db successfully; proceed 
      '... 
     End If 
    End Sub 

    Private Sub StopWork(sender As Object, e As EventArgs) Handles Me.WorkerStopped 
     Me.Stop() 
    End Sub 
End Class 

如果你想獲得看上你可以宣佈自己的自定義WorkerStoppedEventArgs類型,並通過香草EventArgs的那個來代替。或者它是自定義的,你可以根本不需要任何爭論,但我喜歡在那裏遵守慣例。

我希望我能保證這項工作,但自從我編寫Windows服務已經過去6年了,我記得他們不是很容易就開始嘗試!

+0

我實現了Tony Hinkle建議的BackgroundWorker解決方案;但是,RaiseEvent +事件處理程序解決方案看起來不錯。感謝您的優雅建議。 – user3076228

相關問題