問題,利用多線程解決界面卡死時,控件不能在新建的線程中訪問。
解決方法,
可使用Invoke或BeginInvoke,在擁有此控件的基礎窗口句柄的線程上執行指定的委託。
Invoke 方法 (Delegate) :在擁有此控件的基礎窗口句柄的線程上執行指定的委託;
BeginInvoke 方法 (Delegate) :在創建控件的基礎句柄所在線程上異步執行指定委託。
代碼:
Public Class Form1
Private Delegate Sub AddLstItemDelegate(ByRef lst As ListBox, ByVal txt As String)
Private Sub AddLstItemInvoke(ByRef lst As ListBox, ByVal txt As String)
lst.Items.Add(txt)
End Sub
Private th As Threading.Thread
Private Sub TaskTest()
Dim i As Integer
For i = 0 To 20
Threading.Thread.Sleep(1000)
ListBox1.Invoke(New AddLstItemDelegate(AddressOf AddLstItemInvoke), New Object() {ListBox1, i.ToString})
Next
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
th = New Threading.Thread(AddressOf TaskTest)
th.Start()
End Sub
End Class