2009-06-17 5 views
4

백그라운드 작업자를 직접 "다시 시작"할 수있는 방법이 있습니까? CancelAsync() 다음에 RunWorkerAsync()를 호출하면 이름에서 알 수 있듯이 명확하게 호출되지 않습니다.백그라운드 작업자를 다시 시작하십시오.

배경 정보 : .net 2.0 Windows Forms 앱에서 총계를 계산하는 백그라운드 작업자가 있습니다. 사용자가이 총계의 일부인 값을 수정할 때마다 백그라운드 작업자가 실행중인 경우에 대비하여 최신 값을 직접 고려하도록 다시 시작하고 싶습니다.

답변

6

backgriound 작품 자체는 어떤 cancleing도하지 않습니다.

bgw.CancelAsync을 호출하면 백그라운드 작업자에게 DoWork 처리기에서 자신을 확인해야하는 플래그를 설정합니다. 같은

뭔가 :

bool _restart = false; 

private void button1_Click(object sender, EventArgs e) 
{ 
    bgw.CancelAsync(); 
    _restart = true; 
} 

private void bgw_DoWork(object sender, DoWorkEventArgs e) 
{ 

    for (int i = 0; i < 300; i++) 
    { 
     if (bgw.CancellationPending) 
     { 
      break; 
     } 
     //time consuming calculation 
    } 
} 

private void bgw_WorkComplete(object sender, eventargs e) //no ide to hand not sure on name/args 
{ 
    if (_restart) 
    { 
     bgw.RunWorkerAsync(); 
     _restart = false; 
    } 

} 
+1

나는 이것을 매우 잘 알고 있습니다. 질문은 배경 작업자를 직접 종료 (강제?)하고 다시 시작할 수있는 다른 메커니즘이 있는지 여부입니다. – Marc

+1

귀하의 질문에 암시 된 내용이 아닙니다. 에릭이 말했듯이, 당신은 단지 쓰레드를 사용하고 그것을 수동으로 중단해야합니다. – Pondidum

0
당신은 값이 변경되는 컨트롤의 변경 이벤트 핸들러 후크와 핸들러에서 다음을 수행 할 수 있습니다

:

if(!bgWrkr.IsBusy) 
    //start worker 
else if(!bgWrkr.CancellationPending) 
    bgWrkr.CancelAsync(); 

는 희망이 당신 도움이!

+1

이 문제를 해결하지만, 단지 그것을 설명하지 않는다 : 나는 당신의 예에서 CancelAsync()를 호출하면 다음 배경 작업자가 최신 값을 다시 계산하기 위해 다시 시작되지 않습니다. 재미있는 소리 – Marc

2

이 옵션의 커플 모두 당신이 고양이 피부하려는 방법에 따라 달라집니다

당신이 BackgroundWorker을 계속 사용하려면이, 당신이 설정된 모델을 존중해야을, 즉 , "진행 감도"중 하나. 지연 내역 취소가 필요한지 (즉, DoWork 회 돌이에서 특정 금액의 폴링이 필요함) 항상 깨닫는 데는 DoWork 내부의 물건이 분명히 필요합니다.

계산 코드가 모 놀리 식이고 혼란스럽지 않으려면 BackgroundWorker을 사용하지 말고 직접 스레드를 실행하십시오. 이렇게하면 필요에 따라 강제로 죽일 수 있습니다.

+0

확인 ...) CancelAsync (후 RunWorkerAsync()를 호출 취소가 asynchronosly 처리로도 문제가 해결되지 않습니다. 스레드를 직접 사용하기위한 특정 설명서를 권장 할 수 있습니까? – Marc

+0

이 MSDN 링크를 확인하십시오. http://msdn.microsoft.com/en-us/library/system.threading.thread.aspx – Pondidum

0

요청을 실행 상태로두고 싶지만 더 이상 결과에 관심이 없습니다. 백그라운드 작업자의 가치를 무시합니다 (바쁜 회 전자가 isBusy 플래그를 사용하고 있습니다).

private void SearchWorkerCreate() { 
     this.searchWorker = new BackgroundWorker(); 
     this.searchWorker.DoWork += this.SearchWorkerWork; 
     this.searchWorker.RunWorkerCompleted += this.SearchWorkerFinish; 
    } 

    private void SearchWorkerStart(string criteria){ 
     if(this.searchWorker.IsBusy){ 
      this.SearchWorkerCreate(); 
     } 
     this.searchWorker.RunWorkerAsync(criteria); 
     this.OnPropertyChanged(() => this.IsBusy); 
     this.OnPropertyChanged(() => this.IsIdle); 
    } 
관련 문제