2014-02-27 102 views
0

任何人都可以請告訴我如何解決這個問題?我不斷收到「跨線程操作無效錯誤」。我覺得我需要以某種方式在單獨的線程中添加公共事件,但不知道如何。謝謝跨線程操作無效錯誤

Public Class Form2 
    Public WithEvents _tasks As New Tasks 

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load 
     _tasks.StartThread() 
    End Sub 

    Public Sub task1(msg As String) Handles _tasks.DoTask1 
     TextBox1.Text &= msg 
    End Sub 
End Class 

Public Class Tasks 
    Public Event DoTask1(msg As String) 

    Public _thread As New Thread(AddressOf TasksThread) 

    Public Sub StartThread() 
     _thread.Start() 
    End Sub 

    Public Sub TasksThread() 
     Do 
      RaiseEvent DoTask1("1") 
      Thread.sleep(1000) 
     Loop While True 
    End Sub 
End Class 
+0

[跨線程操作無效:從比它創建的線程以外的線程訪問控制]的可能重複(http://stackoverflow.com/questions/142003/cross-thread-operation-not-valid-control-from-a-thread-other-the) –

回答

1

試試這個:

Public Sub task1(msg As String) Handles _tasks.DoTask1 

    If TextBox1.InvokeRequired Then 
     TextBox1.Invoke(Sub() TextBox1.Text &= msg) 
    Else 
     TextBox1.Text &= msg 
    End If 

End Sub 
+0

只是爲了確認,當試圖從另一個線程訪問窗體上的控件時,我必須使用Invoke或BeginInvoke。如果我試圖從另一個線程訪問一個類,我可以通過引用來傳遞這個類,或者使用RaiseEvent,我只需要確保我爲該類中正在寫入的變量計時。這聽起來像是一個好標準嗎?你知道我可以閱讀關於多線程的好書嗎?一切都很難理解。謝謝 – wayofthefuture

0

您正在修改UI線程以外的線程的UI控件。您需要編組您的事件處理程序調用Textbox1.Text

有幾十個與此相關的類似SO問題和答案。這裏是one

+0

所以我猜RaiseEvent不是用於交叉線程,我必須使用Invoke? – wayofthefuture

+0

RaiseEvent將觸發通常會在自己的線程上觸發的事件。您的處理程序'Public Sub task1(msg As String)處理_tasks.DoTask1'將因此從非UI線程執行。由於它試圖觸摸一個UI對象,這就是你將得到這個異常的地方,這就是你需要使用Invoke或其他方法將調用回調到UI線程的地方。 –

相關問題