C # É possível interromper um segmento específico dentro de um ThreadPool?
-
19-09-2019 - |
Pergunta
Suponha que eu tenho na fila um item de trabalho em um ThreadPool
, mas os blocos de item de trabalho se não houver dados para processar (leitura de um BlockingQueue
). Se a fila estiver vazia e não haverá mais trabalho vai para a fila, então eu deve chamar o método Thread.Interrupt
se eu quiser interromper a tarefa de bloqueio, mas como é que se faz a mesma coisa com um ThreadPool
?
O código pode ter esta aparência:
void Run()
{
try
{
while(true)
{
blockingQueue.Dequeue();
doSomething();
}
}
finally
{
countDownLatch.Signal();
}
}
Estou ciente de que a melhor coisa a fazer nesta situação é usar um Thread
regular, mas eu estou querendo saber se existe uma maneira ThreadPool
equivalente a interromper um item de trabalho.
Solução
Qual BlockingQueue
é isso? É que uma classe BCL? classe TPL? Ou personalizado?
Não importa; simplesmente - eu não faria. Você poderia fazer algo no início da vida do segmento para armazenar a referência fio, mas eu simplesmente não usaria a ThreadPool
para este trabalho, pois parece que é mais longo em execução. A Thread
regulares parece mais apropriado.
Eu também estou surpreso que não existe um método embutido de contar a fila para liberar todos os trabalhadores - Eu escrevi o bloqueio filas antes, e eu tendem a usar o padrão (por exemplo, from aqui ):
public bool TryDequeue(out T value) {...}
com este:
- retornando true imediatamente se houver dados
- bloqueio e (eventualmente) retornando true se não houver dados, mas alguns é adicionado
- bloqueio e (eventualmente) retornar false se a fila está sendo desligado