2011-03-07 4 views
3

다음 코드는 1에서 100까지의 숫자를 더하고 합계를 반환합니다. 내가하려는 것은 backgroundworker에서 계산을 실행하고 값을 반환하는 것입니다. 문제는 DoWork가 완료되기 전에 returnValue가 리턴된다는 것입니다. 값을 반환하기 전에 백그라운드 작업자가 완료 될 때까지 어떻게 기다릴 수 있습니까? (나는 ... 내 DoWork의 반환을 넣을 수없는 것)BackgroundWorker는 값을 반환합니까?

double returnValue = 0; 

var b = new BackgroundWorker(); 
b.DoWork += new DoWorkEventHandler(
    delegate(object sender, DoWorkEventArgs e) { 
     for(int i=0;i<100;i++){ 
      returnValue += (i+1); 
     } 
    } 
); 

b.RunWorkerAsync(); 
return returnValue; 

부록 : 그것을 배경 노동자이를 실행하는 대신 동일한 스레드에서 메시지 펌프를 보내 더 나은 것인가?

또한이 코드는 예제 코드이며 실제 코드는 완료하는 데 1 분 이상 걸립니다.

+1

http://stackoverflow.com/questions/939635/how-to와 거의 같은 질문입니다. -make-backgroundworker-return-an-object –

+0

가능한 복제 http://stackoverflow.com/questions/5182782/c-return-value-from-function-invoked-in-thread/5201814#5201814 –

+1

무엇을 요구하고 있습니까? 해야 할 일은 말이되지 않습니다. 'BackgroundWorker'에서 코드를 실행하려하지만'BackgroundWorker'가 끝날 때까지 호출하는 메소드가 돌아 오지 못하게하려고합니다. –

답변

3

RunWorkerCompleted 이벤트를 구독하십시오. 이 이벤트에는 백그라운드 작업의 반환 값이 포함됩니다. 물론

는, 그 값이 너무처럼 DoWorkEventHandler 내부에서 반환되는 :

b.DoWork += new DoWorkEventHandler(
    delegate(object sender, DoWorkEventArgs e) { 
     double returnValue = 0; 
     for(int i=0;i<100;i++){ 
      returnValue += (i+1); 
     } 
     return returnValue; 
    } 
); 
+0

네, 잘되었습니다. 나는 또한 반환 값이 객체 또는 구조체가 될 수 있다고 생각한다. – mtone

+0

not worked.error DoWorkEventHandler가 void를 반환하면 반환 키워드 뒤에 객체를 두어서는 안됩니다. –

0

난 정말 여기에 질문이 표시되지 않습니다,하지만 난 당신이 찾고있는 생각하는 것은 이벤트가 RunWorkerCompleted라고 . DoWork 대리인이 완료되면이 메시지가 발생합니다. 이것이 당신이 찾고있는 것이 아니라면, 나는 당신이 당신의 질문을 다시 말해야한다고 생각합니다.

-1

BAD 인 BackgroundWorker와의 동기 작업을 시도하고 있습니다. 그러나해야한다면 IsBusy 플래그를 사용할 수 있습니다.

double returnValue = 0; 

var b = new BackgroundWorker(); 
b.DoWork += new DoWorkEventHandler(
    delegate(object sender, DoWorkEventArgs e) { 
     for(int i=0;i<100;i++){ 
      returnValue += (i+1); 
     } 
    } 
); 

b.RunWorkerAsync(); 
while(b.IsBusy){ 
    Application.DoEvents(); 
} 
return returnValue; 
+1

이 경우는 BackgroundWorker의 목적을 상실합니다. – Bryan

+0

@ 브라이언. 하지만 BackgroundWorker가 끝날 때까지 기다려야한다면 왜 BackgroundWorker를 사용해야할까요? –

+0

메시지 펌프가 더 좋을까요? – sooprise

0

가 나는 샘플을 postet 한 : here이 은 어쩌면

는 또한이 단지 예제 코드는, 내 실제 코드는 분을 완료하는 것보다 더 걸리는 :-) 당신을 도울 수 있습니다.

이것은 비동기 시작 효과가 될 수 있습니다. 당신은 backgroundworker에게 언제 시작할 것인지 아니면 그냥 시작이라고 말할 수 있습니다. 당신이 명시하지 않으면 그가 지금 시작해야한다고 말하면서 C#이 시작하기 좋은 시간이라고 생각할 때 시작합니다 :-)

관련 문제