форма обновления для асинхронного управляющего события - PullRequest
2 голосов
/ 31 января 2012

Несколько недель назад я написал оболочку для элемента управления 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

Если бы мне пришлось угадывать, я бы сказал, что есть какая-то проблема с потоками, но яЯ не уверен, как справиться с этим в форме.Есть идеи?

1 Ответ

3 голосов
/ 31 января 2012

Если это проблема с потоками, то вы, вероятно, пытаетесь обновить пользовательский интерфейс из потока, не являющегося пользовательским интерфейсом.

Так что-то вроде этого должно решить это ...

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   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...