2012-01-31 12 views
2

数週間前、ServiceControllerコントロールのラッパーを作成して、ベースのServiceControllerを強化し、合理化しました。私が行った変更の1つは、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

関連する問題