2012-01-31 22 views
2

幾個星期前,我編寫了一個ServiceController控件的包裝來增強和簡化基本ServiceController。我做的一個修改是使用System.Threading.Timer對象添加一個監視組件。在任何狀態改變時,都會向父級提出事件。實際監控工作正常,但是當主要形式處理事件時,我的程序突然結束 - 沒有例外,沒有警告,它只是退出。下面是控制的框架版本:在異步控制事件上更新表單

Public Class EnhancedServiceController 
    Inherits ServiceController 

    Public Event Stopped(ByVal sender As Object, ByVal e As System.EventArgs) 
    Public Event Started(ByVal sender As Object, ByVal e As System.EventArgs) 

    Private _LastStatus As System.ServiceProcess.ServiceControllerStatus 

    Private serviceCheckTimer as System.Threading.Timer 
    Private serviceCheckTimerDelegate as System.Threading.TimerCallback 

    ... 

    Private Sub StartMonitor() 
     MyBase.Refresh() 
     _LastStatus = MyBase.Status 
     serviceCheckTimerDelegate = New System.Threading.TimerCallback(AddressOf CheckStatus) 
     serviceCheckTimer = New System.Threading.Timer(serviceCheckTimerDelegate, Nothing, 0, 60*1000) 
    End Sub 

    Private Sub CheckStatus() 
     MyBase.Refresh() 
     Dim s As Integer = MyBase.Status 
     Select Case s 
      Case ServiceControllerStatus.Stopped 
       If Not s = _LastStatus Then 
        RaiseEvent Stopped(Me, New System.EventArgs) 
       End If 
      Case ServiceControllerStatus.Running 
       If Not s = _LastStatus Then 
        RaiseEvent Started(Me, New System.EventArgs) 
       End If 
     End Select 
     _LastStatus = s 
    End Sub 

End Class 

而且形式:

Public Class Form1 
    Private Sub ServiceStarted(ByVal sender As Object, ByVal e As System.EventArgs) Handles ESC.Started 
     Me.TextBox1.Text = "STARTED" 
    End Sub 

    Private Sub ServiceStopped(ByVal sender As Object, ByVal e As System.EventArgs) Handles ESC.Stopped 
     Me.TextBox1.Text = "STOPPED" 
    End Sub 
End Class 

如果我猜的話,我會說,有某種線程的問題,但我不知道如何處理表單中的內容。有任何想法嗎?

回答

3

如果這是一個線程問題,那麼你可能試圖從非UI線程更新UI。

所以這樣的事情應該解決......

Private Delegate Sub UpdateTextBoxDelegate(byval tText as String) 

Private Sub UpdateTextBox(byval tText As String) 
    If Me.InvokeRequired Then 
     Me.Invoke(New UpdateTextBoxDelegate(AddressOf UpdateTextBox), tText) 
     Exit Sub 
    End If 

    TextBox1.Text = tText 
End Sub 

Private Sub ServiceStarted(ByVal sender As Object, ByVal e As System.EventArgs) Handles ESC.Started 
    UpdateTextBox ("STARTED") 
End Sub 

Private Sub ServiceStopped(ByVal sender As Object, ByVal e As System.EventArgs) Handles ESC.Stopped 
    UpdateTextBox("STOPPED") 
End Sub 
+0

這奏效了。謝謝! – mounty 2012-01-31 17:15:22