沒常在寫應用程式所以不太暸....
今天要在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,但可能會發生不可預期的錯誤

想請問一下,您寫的委派處理程式碼中,我實作後發現程式好像沒有用到委派的功能也可以顯示出"連線中"的字串耶。 將 If 判斷式中整個拿除只剩 c.text = Mytext 也是會正常顯示"連線中" 耶..
喔喔 我剛拿出我以前寫一半後很久沒動的這隻 XD 然後把委派拿掉還是會出現 "跨執行緒作業無效: 存取控制項 'Login_Status' 時所使用的執行緒與建立控制項的執行緒不同。" 我在想~不知道是不是用的元件是舊的關係,我是用MSNPSharp 用的版本是 3.1.0.1719,我剛看了一下現在都已經 5.0.2 囉 http://code.google.com/p/msnp-sharp/wiki/Downloads?tm=2 至於我遇到的錯誤訊息,感覺他是用另一個執行緒去變更我控制項的狀態的樣子
我在學多執行緒處理,後來看到你的文章。 我稍微修改你的程式, 將呼叫 UpdateUI("連線中...", Me.Login_Status) 改成 UpdateUI("連線中...", Textbox1) ,並放入 Form_Load 中執行出來的結果,請問是不是我有哪邊弄錯了? 可以指導我一下嗎?
忘了說明,我不是玩 msnp-sharp,單純在學執行緒,將您的程式碼丟到 Form 中 嘗試執行了解一下程式運作情況這樣~ 下方是我的程式碼: Private Delegate Sub UpdateUICB(ByVal MyString As String, ByVal c As Control) Private Sub UpdateUI(ByVal MyString As String, ByVal c As Control) TextBox2.Text = InvokeRequired If Me.InvokeRequired() Then Dim CB As New UpdateUICB(AddressOf UpdateUI) Me.Invoke(CB, MyString, c) Else c.Text = MyString End If End Sub Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load UpdateUI("連線中...", TextBox1) End Sub
如果是單純改變控制項的值,好像用不到多執行緒啊 Private Sub UpdateUI(ByVal MyString As String, ByVal c As Control) TextBox2.Text = InvokeRequired If Me.InvokeRequired() Then '<---------------------------所以 InvokeRequired() 才會跑 false Dim CB As New UpdateUICB(AddressOf UpdateUI) Me.Invoke(CB, MyString, c) Else c.Text = MyString '<------------------ 所以你全部拿掉只剩這行當然也是可以的 End If End Sub http://msdn.microsoft.com/zh-tw/library/system.windows.forms.control.invokerequired(VS.80).aspx
請問執行緒要怎麼使用呢?
喔 可以參考 http://msdn.microsoft.com/zh-tw/library/ms173178.aspx 下面的相關主題都有 vb.net 的範例 ex:http://msdn.microsoft.com/zh-tw/library/ck8bc5c6.aspx