2014-03-28 1 views
1

거기에 BW에 대한 많은 질문이 있다는 것을 알고 있지만, 나는 아직도이 질문을 할 필요가 있다고 느꼈다./내가 원하는 정보를 얻은 것처럼 느껴지지 않았다 ... 아니면 누군가가이 정보를 나에게 설명해야한다. 그걸 이해할 수있는 방법은 ... 실제로는 BW.CancelAsync()을 호출하는 실제 목적이 없습니다. CancellationPending 플래그를 true로 설정하는 것 외에도 ...BackgroundWorker 왜 CancelAsync()를 호출합니까?

기본적으로 제 질문은 :을 BW에 호출하는 이유는 무엇입니까?

또는 다른 방식으로 같은 질문 : 내 코드가이 방법으로 설정 되었습니까? 아니면 확인해야합니까? 아니면 CancelAsync()을 절대 호출해야합니까? CancelAsync()이 코드가 처리하지 못하는 용도는 무엇입니까?

이것은 약간 멍청하지만 어쨌든 일반적인 아이디어를 얻습니다.

void BW_DoWork(object sender, DoWorkEventArgs e) 
{ 
    Process_Status LastProcessed = Process_Status.None; 

    foreach(Iteration iter in Iterations) 
    { 
     //global form flag set when user presses CANCEL AND ROLLBACK button... 
     if (!this.IsRollBack) 
     { 
      try 
      { 
       //DO SOME WORK HERE 
       LastProcessed = Process_Status.SomethingSucceeded; 
      } 
      catch 
      { 
       this.LastFail = Process_Status.SomethingFailed; 
       //this, for me, cancels the thread and runs RunWorkerCompleted... 
       e.Cancel = true; 
      } 
     } 
     else 
     { 
      this.LastFail = LastProcessed; 
      //this, for me, cancels the thread and runs RunWorkerCompleted... 
      e.Cancel = true; 
     } 
    } 
} 

그리고 다음 RunWorkerCompleted에서

...

void BW_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    if (e.Cancelled) 
    { 
     switch(this.LastFail) 
     { 
      //DO SOMETHING MEANINGFUL HERE BASED ON GLOBAL STATUS... 
     } 
    } 
} 

누군가가 나를 더 나은 CancelAsync()의 목적을 이해하는 데 도움이 수 있습니까?

답변

1

취소 버튼을 의미합니다. 취소 버튼을 클릭하면 CancelAsync()가 호출됩니다.

BackgroundWorker DoWork에서 E.Cancel = true 일 때 스캔합니다. E.Cancel이 사실 인 것을 감지하면 제어 된 방식으로 백그라운드 작업자 내부의 코드를 중지합니다.

이렇게하면 강제로 멈추지 않고 BackgroundWorker 내부에서 수행중인 작업을 정리할 수 있습니다.

전역 변수를 사용하여이 작업을 수행 할 수 있습니다. CancelAsync는 더 깨끗한 방법입니다.

관련 문제