見下面的程序。 我用功能abc開始一個新的線程x,然後我做一些更長的任務。 爲什麼x只在end sub之後開始?它不應該馬上開始睡覺嗎?爲什麼我的線程不能立即啓動?
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim x As New Threading.Thread(AddressOf abc)
x.SetApartmentState(Threading.ApartmentState.MTA)
x.Start()
System.Threading.Thread.Sleep(5000)
End Sub
Sub abc()
For i As Integer = 0 To 10 Step 1
Me.lblStatus.Text = "Testing DB connection (timeout in: " + i.ToString() + "s)"
'Me.StatusStrip1.Invoke(
MsgBox(i.ToString)
System.Threading.Thread.Sleep(1000)
Next
End Sub
編輯:
解決的辦法是這樣的:
(A)將兩個連接嘗試和超時倒計時到單獨的線程。
(B)更新這樣的UI:
If Me.InvokeRequired Then
Me.Invoke(pUpdateStatusMessage, "Successfully connected.")
Else
UpdateStatusMessage("Successfully connected.")
End If
有了這個全局聲明,所以沒有參數傳遞是必要的:
Delegate Sub t_pUpdateStatusText(ByVal strMessage As String)
Public pUpdateStatusMessage As t_pUpdateStatusText = New t_pUpdateStatusText(AddressOf UpdateStatusMessage)
Public Sub UpdateStatusMessage(ByVal strMessage As String)
Me.lblStatus.Text = strMessage
Me.StatusStrip1.Update()
End Sub
你如何驗證線程只在方法結束後才啓動?你在看標籤嗎?還是你在等待一個斷點? – 2010-10-04 16:05:35
實際上,當它沒有顯示時,我設置了一個斷點。 – 2010-10-05 06:52:00