VB.NET 多线程.从单独的类文件中的类调用 UI 控件



几天来我一直在试图理解这一点,想知道这是否是我错过的简单东西或完全做错了。

例:两个文件 - TestClass.vb,myForm.vb


TestClass.vb 如下所示:

Imports System.Threading
Public Class TestClass
    Private myClassThread As New Thread(AddressOf StartMyClassThread)
    Public Sub Start()
        myClassThread.Start()
    End Sub
    Private Sub StartMyClassThread()
        myForm.Msg("Testing Message")
    End Sub
End Class

myForm.vb 是一个基本窗体,具有一个列表框控件和一个分别命名为"输出"和"开始按钮"的按钮控件。表单背后的代码如下所示:

Public Class myForm
    Private classEntity As New TestClass
    Private Sub StartButton_Click(ByVal sender As System.Object, _
                                  ByVal e As System.EventArgs) _
                              Handles StartButton.Click
        Msg("Start Button Pressed")
        classEntity.Start()
    End Sub
    Delegate Sub MsgCallBack(ByVal mesg As String)
    Public Sub Msg(ByVal mesg As String)
        If Output.InvokeRequired Then
            MsgBox("Invoked")
            Dim d As New MsgCallBack(AddressOf Msg)
            Invoke(d, New Object() {mesg})
        Else
            MsgBox("Not Invoked")
            mesg.Trim()
            Output.Items.Add(mesg)
        End If
    End Sub
End Class

结果:

应用程序运行,没有错误或异常。显示的是列表框和"开始"按钮。我按下开始按钮,消息框按预期显示"未调用",单击确定后,该消息框"启动按钮按下"将添加到输出列表框控件中。紧接着,消息框再次弹出并显示"未调用"。我期待"调用",因为单独的线程正在尝试使用输出列表框控件。当然,这会导致尝试 Output.Items.Add,这会导致没有可见的结果,因为不允许线程直接更新 UI 控件。

一定读过一本不同页面的小书,试图彻底了解坑落和方法,但我觉得我可能已经落入了很多人可能会做的陷阱。以我目前的理解和知识,我无法摆脱这个陷阱,并希望任何意见或建议。

亲切问候

莱 克 斯

这里的问题是,您不是在myForm的实例上调用Msg函数,而是在myForm类的共享函数上调用该函数。

更改代码TestClass以添加

Public FormInstance as myForm

然后替换

myForm.Msg("Testing Message")

FormInstance.Msg("Testing Message")

然后在StartButton_Click中添加该行

classEntity.FormInstance = Me

你会得到预期的结果。

相关内容

  • 没有找到相关文章

最新更新