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

Lec*_*nox 6 vb.net user-interface multithreading .net-4.0 visual-studio-2010

我已经尝试了解这几天了,并想知道这是不是很简单,我错过了或完全错了.

示例:两个文件 - 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
Run Code Online (Sandbox Code Playgroud)

myForm.vb是一个基本表单,其中包含一个列表框控件和一个分别名为Output和StartButton的按钮控件.表格背后的代码如下:

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
Run Code Online (Sandbox Code Playgroud)

结果:

应用程序运行,没有错误或异常.显示的是列表框和"开始"按钮.我按下开始按钮,msgbox按预期显示"未调用",单击"确定"后,msgbox"按下按钮"将添加到"输出"列表框控件中.紧接着,msgbox再次弹出并说"Not Invoked".我期待"Invoked"作为一个单独的线程试图使用输出列表框控件.当然,这会导致尝试输出Output.Items.Add,因为不允许线程直接更新UI控件,因此不会产生任何可见结果.

我必须阅读一本不同页面的小书,试图彻底了解坑落和方法,但我觉得我可能陷入了许多人可能会做的陷阱.凭借我目前的理解和知识,我无法摆脱这个陷阱,并希望得到任何意见或建议.

亲切的问候,

莱克斯

Sou*_*mya 3

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

更改您的代码TestClass以添加

Public FormInstance as myForm
Run Code Online (Sandbox Code Playgroud)

然后替换

myForm.Msg("Testing Message")
Run Code Online (Sandbox Code Playgroud)

FormInstance.Msg("Testing Message")
Run Code Online (Sandbox Code Playgroud)

然后StartButton_Click添加行

classEntity.FormInstance = Me
Run Code Online (Sandbox Code Playgroud)

你会得到预期的结果。