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
, 나는 스레드 문제가 어떤 종류의가 있다고 말하고 싶지만,하지만 잘 모르겠어요 그걸 양식으로 다루는 법. 어떤 아이디어?
합니다. 감사! – mounty