沒常在寫應用程式所以不太暸....

今天要在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,但可能會發生不可預期的錯誤

arrow
arrow
    全站熱搜

    小雕 發表在 痞客邦 留言(4) 人氣()