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.

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top