gpt4 book ai didi

vb.net - 异步控制事件的更新表单

转载 作者:行者123 更新时间:2023-12-04 05:59:40 24 4
gpt4 key购买 nike

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

关于vb.net - 异步控制事件的更新表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9083329/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com