2014-11-24 5 views
0

내 코드에서 두 개의 BackgroundWorkers가 있습니다. 하나는 작업을 수행하고 둘은 함께 실행되므로 두 번째 작업이 완료 될 때까지 기다릴 필요가 있음을 의미합니다. 내가 작업 할 때 주 윈도우를 클릭 할 때 크래시가 발생합니다. 어떻게해야합니까?WFP BackgroundWorker가 다른 BackgroundWorker가 완료 될 때까지 기다림

+0

'나는 작업 중에 메인 윈도우를 클릭 할 때 응용 프로그램을 중단시키지 마십시오.'유일한 방법은 신중하게 테스트하고 코드를 디버깅하는 것입니다. – kennyzx

+0

기본적으로 [동기화] (http://www.albahari.com/threading/part2.aspx)에 대해 묻지 만 함께 실행할 수없는 경우 * 왜 두 개의 'BackgroundWorker'가 필요합니까? 하나를 가지고 두 가지 작업 중 하나를 선택하기위한 매개 변수를 제공하십시오. – Sinatr

+0

* 작업 *을 사용하지 않는 이유는 무엇입니까? 또는 * async/C# 5의 경우 기다리고 있습니까? 이 두 가지 방법 모두 훨씬 쉬우 며 시나리오에 대한 지원이 기본 제공됩니다. – galenus

답변

2

첫 번째 일은 아마도 1 BackgroundWorker에서 모든 배경 작업을 수행 할 수 있습니다.

질문에 대한 답변을 얻으려면 1 번째 RunWorkerCompleted 이벤트 처리기에서 2 번째 BackgroundWorker을 시작할 수 있습니다.

bw1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw1_RunWorkerCompleted); 

private void bw1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    //celebration! 

    //and then start the 2nd BackgroundWorker 
    BackgroundWorker bw2 = new BackgroundWorker(); 
    bw2.DoWork += new DoWorkEventHandler(bw2_DoWork); 
    bw2.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw2_RunWorkerCompleted); 
    bw2.RunWorkerAsync(); 
}  
+0

테스트 할 것입니다 ... RunWorkerCompleted 이벤트를 사용하면 주 스레드에서 실행됩니다 ... – user3719173

+0

예,'RunWorkerCompleted'는 주 스레드에서 실행됩니다. 이것이 BackgroundWorker가 발명 된 이유이며, 일부 사람들은 UI를 업데이트하기 위해 메인 스레드에 마샬링해야한다는 것을 인식하지 못합니다. – kennyzx

관련 문제