沒常在寫應用程式所以不太暸....
今天要在msn登入時去改變 label.text 的值為 "連線中" 遇到問題
錯誤訊息是 "跨執行緒作業無效"
google 真是好用,原因是在應用程式中禁止利用跨執行緒去存取UI (可能會發生不可預期的錯誤)
因此必須利用委派的方式處理
ex :
Private Delegate Sub UpdateUICB(ByVal MyText As String, ByVal c As Control)
Private Sub UpdateUI(ByVal MyText As String, ByVal c As Control)
If Me.InvokeRequired() Then
Dim cb As New UpdateUICB(AddressOf UpdateUI)
Me.Invoke(cb, MyText, c)
Else
c.Text = MyText
End If
End Sub
然後使用
UpdateUI("連線中...", Me.Login_Status)
註 :
利用 InvokeRequired 判斷是不是在建立控制項之外的執行緒
http://msdn.microsoft.com/zh-tw/library/system.windows.forms.control.invokerequired(VS.80).aspx
如果是的話就利用委派 + Invoke的方式切換到原來的執行序給予值,不然就直接給值
http://msdn.microsoft.com/zh-tw/library/zyzhdc6b(VS.80).aspx
然後還有另一個方法是加入
Form.CheckForIllegalCrossThreadCalls = False
加入後就可跨執行序存取UI,但可能會發生不可預期的錯誤
留言列表