几天来我一直在试图理解这一点,想知道这是否是我错过的简单东西或完全做错了。
例:两个文件 - 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
你会得到预期的结果。