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
私は推測していた場合、私は、スレッドの問題のいくつかの並べ替えがあることを言うだろうが、私はよく分かりませんフォームでそれを処理する方法。何か案は?
トリックをしました。ありがとう! – mounty