Vb.net 异步控件事件的更新表单

Vb.net 异步控件事件的更新表单,vb.net,winforms,Vb.net,Winforms,几周前,我为ServiceController控件编写了一个包装器,以增强和简化基本ServiceController。我所做的更改之一是使用System.Threading.Timer对象添加了一个监控组件。在状态发生任何更改时,都会向父类引发一个事件。实际的监控工作正常,但是当事件以主窗体处理时,我的程序突然结束——没有异常,没有警告,它只是退出。下面是控件的骨架版本: Public Class EnhancedServiceController Inherits ServiceCo

几周前,我为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

如果非要我猜的话,我会说存在某种线程问题,但我不确定如何在表单中处理它。有什么想法吗?

如果是线程问题,那么您可能正在尝试从非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