加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-17 00:11:26 所属栏目:大数据 来源:网络整理
导读:我已经尝试了解这几天了,并想知道这是不是很简单,我错过了或完全错了. 例: 两个文件 – TestClass.vb,myForm.vb TestClass.vb如下所示: Imports System.ThreadingPublic Class TestClass Private myClassThread As New Thread(AddressOf StartMyClassThrea
我已经尝试了解这几天了,并想知道这是不是很简单,我错过了或完全错了.

例:
两个文件 – 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是一个基本表单,其中包含一个列表框控件和一个分别名为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

结果:

应用程序运行,没有错误或异常.
显示的是列表框和“开始”按钮.
我按下开始按钮,msgbox按预期显示“未调用”,单击“确定”后,msgbox“按下按钮”将添加到“输出”列表框控件中.
紧接着,msgbox再次弹出并说“Not Invoked”.我期待“Invoked”作为一个单独的线程试图使用输出列表框控件.
当然,这会导致尝试输出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

你会得到预期的结果.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读