/ / O IsBusy do BackgroundWorker é o mesmo que "IsAlive"? - c #, winforms, .net-4.0, backgroundworker, cão de guarda

IsBusy de BackgroundWorker é igual a "IsAlive"? - c #, winforms, .net-4.0, backgroundworker, cão de guarda

Estou tentando descobrir uma maneira de verificar se um thread do BackgroundWorker está ativo (ou seja, ainda em execução. O thread é essencialmente implementado como um loop infinito simples:

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

A coisa mais próxima de IsAlive() Eu encontrei até agora é o Está ocupado propriedade, mas como meu segmento Sleep () é na maioria das vezes, não tenho certeza se isso fará o trabalho.

Posso contar com Está ocupado façam:

if (!myWorker.IsBusy)
RestartWorker();

ou estou pedindo problemas?

Respostas:

13 para resposta № 1

BackgroundWorker.IsBusy é verdade desde que o manipulador de eventos do DoWork esteja ocupado e o manipulador de eventos RunWorkerCompleted ainda não foi executado. Observe a última cláusula, a propriedade não informar se o seu loop está ativo.

Além disso, há uma condição de corrida bastante desagradável no seu segundo snippet. IsBusy pode ser verdadeiro no if() declaração, mas seja falso um nanossegundo mais tarde. O tipo de corrida que acontece uma vez por mês. A intenção do código é difícil de entender a partir dos trechos, tão difícil de fornecer uma solução alternativa. Considere sempre criar um novo objeto BGW, que nunca será executado. Também ajuda a se livrar desse loop, um encadeamento em suspensão por 10 segundos está desperdiçando um recurso do sistema muito caro em não fazer nada. E agiliza o agendador de pool de threads.


7 para resposta № 2

Para garantir que o Backgroundworker realmente tenha parado, você pode matá-lo manualmente. Conjunto yourBackgroundWorker.WorkerSupportsCancellation = true;. Em seguida, basta parar o Backgroundworker com:

yourBackgroundWorker.CancelAsync();

Ainda isBusy deve ser suficiente para detectar uma instância em execução / funcionando do seu BackgroundWorker.


4 para resposta № 3

De docs:

verdade, se o BackgroundWorker estiver executando uma operação assíncrona; de outra forma, falso.

Independentemente de você dormir ou não o thread de trabalho, ele ainda está fazendo algo tão usando IsBusy deve estar bem.