2014-05-11 2 views
-2

폼에 백그라운드 작업자 컨트롤이 있습니다. 나는이 양식을 업데이트하고VB.NET 크로스 스레드 액세스가 잘못되었습니다.

Private _fWait As frmWait 

, 현재 무슨 일이 일어나고 있는지 사용자에게 라벨을 변경 :이 양식에서

는 내가 진행 상황을 보여줍니다 다른 형태를 가지고있다.

배경 작업자가 완료되면 _fWait 양식을 닫고 싶습니다.

"잘못된 크로스 스레드 액세스 할 수 있습니다. : frmWait가에 의해 생성 된 스레드보다 diffent 스레드에서 발생 제어에 대한 액세스를"나는

Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork 

    'do the background worker stuff. I have not stated it here because it is not important 

    _fWait.Close() 

    _bDone = True 

End Sub 

을 사용하고하지만 오류를 얻고있다 _fWait.Close() "줄에.

누군가 내가 뭘 잘못했는지 말해 줄 수 있습니까?

감사합니다.

+0

backgroundworker는 다른 스레드에서 작동하므로 여기에있는 호출은 이미 diff 스레드에 있습니다. 여기에서는 긴 프로세스 작업을 실행 한 다음 worker_completed 또는 progress_changed 이벤트의 컨트롤에 액세스합니다. – OneFineDay

답변

1

_fWait.Close()을 호출 할 때 UI 스레드에서 호출해야하지만 BackgroundWorker1_DoWork 처리기는 다른 스레드에서 실행되어 오류가 발생합니다. 양식을 닫는 두 가지 옵션이 있습니다 :

1) 다음과 같은 코드를 사용하여 UI 스레드에 요청을 DoWork 핸들러에 폼을 닫습니다하지만 마샬링 계속 :

this.Invoke(() => _fWait.Close()); 

그것은 오랜만이야 이후 VB에서, 그래서 당신은 VB로 C# 코드를 변환해야 할거야 ... 미안 해요.

2) RunWorkerCompleted 이벤트를 처리하고 거기에 닫으십시오. BackgroundWorker가 UI 스레드에서 시작된 경우 RunWorkerCompleted도 UI 스레드에서 호출됩니다.

내가 올바르게 기억한다면 ProgressedChanged 이벤트는 UI 스레드에서 BackgroundWorker이 생성되었다고 가정하고 UI에서 호출됩니다. BackgroundWorker가 생성되면 다른 다른 스레드, 다음 RunWorkerCompletedProgressChanged는 별도의 스레드에서 호출을 받고 간단한 프로그램에서 1 단계

+0

솔루션 2) 나를 위해 일했다. 고마워요! – tmighty

0

에서 전술 한 바와 같이, UI에 호출을 마샬링해야합니다, 당신은 무시할 수 당신 Form.Load 방법이를 추가하여 크로스 스레드 오류 :이 공유 데이터에 액세스하는 여러 비동기 스레드를 실행할 때 문제가 발생할 수 있으므로 무차별를 사용하지 않는 것이

CheckForIllegalCrossThreadCalls = False 

참고. 여러 스레드를 실행하는 공유 루틴을 일으킬 경우


, 동시에 여러 인스턴스를 방지하기 위해 SyncLock를 사용합니다.

+0

내가 지정한 속성이 디버깅을 위해 더 많이 사용되고 런타임에 예외가 여전히 throw되는 것을 기억합니다.어쩌면 다른 사람이 이것을 확인할 수 있습니다. 어느 쪽이든이 예외를 무시하는 것은 좋은 습관이 아니며 모든 UI 작업이 올바른 스레드에서 수행되도록하는 것이 좋습니다. – MotoSV

관련 문제