• 쇼핑몰
  • 커뮤니티
  • 북마크

vb.net


[Controls] vb.net 컨트롤이 자신이 만들어진 스레드가 아닌 스레드에서 액세스되었습니다.

하나를하더라도최선을
2021.05.02 10:24 225 0

본문



    '쓰레드 생성을 위한 변수 선언
    Dim t As System.Threading.Thread
 
    '크로스 쓰레드 작업을 위한 콜백 대리자 선언
    Delegate Sub textCallBack(ByVal state As Object)
 
    '콜백 대리자 변수 선언
    Dim cbFunc As textCallBack
 
    Private Sub Form1_Load(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles MyBase.Load
        '쓰레드 생성 후 newThreadFunc 호출
        t = New System.Threading.Thread(AddressOf newThreadFunc)
 
        '쓰레드 시작 & 인수 = "Hello World"
        t.Start(CObj("Hello World"))
    End Sub
 
    Private Sub newThreadFunc(ByVal state As Object)
        If TextBox1.InvokeRequired = True Then '해당 컨트롤이 이 쓰레드에 존재하는지 확인
            'True: 해당쓰레드가 아님, 콜백
            cbFunc = New textCallBack(AddressOf newThreadFunc)
            'TextBox1 작동, 해당 컨트롤이 쓰레드에 존재하지 않으므로 새로운 컨트롤 생성.
            TextBox1.Invoke(cbFunc, New Object() {state})
        Else
            '해당 쓰레드이므로 TextBox에 접근가능
            TextBox1.Text = state.ToString()
        End If
    End Sub
 
가끔 Visual Studio 2003 에서
작성된 코드를 2005 에서 변환 후 실행하면, 크로스 쓰레드 오류가 발생하는 경우가
있습니다.
 
2003 처럼, 위와 같은 오류를 무시하고
그냥 작업하는 방법은 아래의 코드를 폼로드 이벤트에 삽입해 주시면
되겠습니다.
 
CheckForIllegalCrossThreadCalls = False
두 번째의 방법을 해결책으로 사용하는건 추천하지 않습니다..
두 번째 방법은 임시 방편으로 사용하시길 추천합니다. ^^

출처 ::: h ttps://social.msdn.microsoft.com/Forums/ko-KR/53528f56-11fc-4d49-9391-c4a88342da58/nettip-invoke47484-51060508575461650668-533564719649828?forum=visualbasicko 


댓글목록 0

등록된 댓글이 없습니다.