我一直試圖瞭解這幾天,現在想知道這是簡單的東西,我失蹤或完全錯誤。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是一個基本的形式與列表框控件和一個名爲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按預期方式顯示「Not Invoked」,並在點擊OK後將msgbox「Start Button Pressed」添加到Output列表框控件中。 緊隨其後msgbox再次彈出並顯示「未被調用」。我期待「調用」作爲一個單獨的線程試圖使用輸出列表框控件。 當然,這會導致Output.Items.Add被嘗試,導致沒有可見的結果,因爲線程不被允許直接更新UI控件。
我一定讀過一本價值不同的小書,試圖徹底理解坑坑窪窪和方法,但我覺得我可能陷入了很多人可能會陷入的陷阱。 以我目前的理解和知識,我無法擺脫困境,並希望得到任何意見和建議。
親切的問候,
萊克斯
Soumya92 - 完美!非常感謝你。只要信譽允許,我就會'投票'。 – Lecronox 2011-05-21 10:20:40