2012-10-30 5 views
5

나는 BackgroundWorker 구성 스레드가 살아 있는지 확인하는 방법을 알아 내려고 노력하고 있어요 (즉 아직 실행 스레드는 기본적으로 간단한 무한 루프로 구현됩니다.BackgroundWorker의 IsBusy가 "IsAlive"와 같은가요?

while (AllConditionsMet()) 
{ 
    DoSomeMagic(); 
    Thread.Sleep(10000); 
} 

IsAlive() 가장 가까운 것은 내가 지금까지 발견 하지만 내 스레드 수면() 대부분의 시간, 나는이 일을 할 것입니다 있는지 확실하지 않다에요 것을 IsBusy 재산 주어진다

내가 할 IsBusy에 셀 수 :.

if (!myWorker.IsBusy) 
    RestartWorker(); 

또는 문제가 있습니까? docs에서

+1

isBusy가 false 인 경우 Backgroundworker가 작업을 수행하지 않으므로 표시된 코드를 사용하여 문제가 발생하지 않습니다. 작업자가 시작되지 않았으므로 "RestartWorker()"메서드 만 잘못된 것입니다. 그러나 그것은 프로그래밍 문제보다 더 많은 언어입니다. – jAC

+2

스레드를 다시 시작하기 위해 코드를 구현하면 문제가 발생합니다. 실패 조건을 감지하고 스레드를 종료하고 완전히 새로운 스레드를 다시 시작하는 것이 더 나을 것입니다. 그렇지 않으면 교착 상태가 발생할 가능성이 큽니다. –

답변

12

BackgroundWorker.IsBusy은 DoWork 이벤트 처리기가 사용 중이면 true입니다. RunWorkerCompleted 이벤트 처리기가 아직 실행되지 않았습니다. 후자의 절을주의하십시오. 속성은 이 아니며은 루프가 활성화되어 있는지 알려줍니다.

두 번째 스 니펫에는 상당히 불쾌한 경쟁 조건이 있습니다. IsBusy는 if() 문에서 true 일 수 있지만 나중에 나노 초에서 false가 될 수 있습니다. 한 달에 한 번 치는 종족의 종류. 코드의 의도는 미리보기에서 너무 힘들어 해결 방법을 제시하기가 어렵습니다. 항상 경주하지 않을 새로운 BGW 객체를 만드는 것을 고려하십시오. 또한 루프를 없애는 데 도움이됩니다. 10 초 동안 잠자고있는 스레드는 아무것도하지 않을 때 매우 비싼 시스템 리소스를 낭비합니다. 그리고 그것은 스레드 풀 스케줄러를 껌으로 만든다.

4

:

사실의 경우 BackgroundWorker가 비동기 작업을 실행하는 경우; 그렇지 않으면,거짓.

당신은 작업자 스레드를 수면에 관계없이 경우 나 말거나, 그렇게 잘해야한다 IsBusy를 사용하여 일을하고 여전히 입니다.

5

Backgroundworker가 실제로 중지되었는지 확인하려면 수동으로 종료 할 수 있습니다. 세트 yourBackgroundWorker.WorkerSupportsCancellation = true;. 그런 다음 단순히으로 BackgroundWorker에 중지 :

yourBackgroundWorker.CancelAsync(); 

아직도 isBusy 당신의 BackgroundWorker의 실행/작업 인스턴스를 감지하기에 충분합니다.