2014-02-27 2 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/크로스 스레드 작업 - 아닌 - 유효하지 않은 컨트롤에서 액세스 스레드에서 다른보다 –

답변

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를 사용할 수 있습니다. 클래스 내에서 쓰여지는 변수를 synclock으로 설정해야합니다. 이것은 좋은 표준처럼 들리니? 멀티 스레딩에 관해 읽을 수있는 좋은 책을 알고 있습니까? 모든 것을 이해하기가 어렵습니다. 감사 – wayofthefuture

0

UI 스레드가 아닌 스레드에서 UI 컨트롤을 수정하고 있습니다. 이벤트 처리기 호출을 Textbox1.Text으로 마샬링해야합니다.

이와 비슷한 SO 질문 및 답변이 수십 개 있습니다. 여기에 one이 있습니다.

+0

그래서 RaiseEvent 크로스 스레드에 대한 의미가 아니 겠지, 나는 Invoke를 사용해야합니까? – wayofthefuture

+0

RaiseEvent는 일반적으로 자체 스레드에서 실행되는 이벤트를 트리거합니다. 처리기'Public Sub task1 (msg As String) Handles _tasks.DoTask1'은 UI가 아닌 스레드에서 실행됩니다. UI 객체를 만지려고하기 때문에 예외가 발생하고 Invoke 나 다른 메소드를 사용하여 호출을 UI 스레드로 마샬링해야합니다. –

관련 문제