2012-01-31 3 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