Pregunta

Supongamos que yo he hizo cola un elemento de trabajo en un ThreadPool, pero los bloques de elementos de trabajo si no hay datos de proceso (la lectura de un BlockingQueue). Si la cola está vacía y no habrá más trabajo entrar en la cola, entonces debe llamar al método Thread.Interrupt si quiero interrumpir la tarea de bloqueo, pero ¿cómo se hace lo mismo con un ThreadPool?

El código podría tener este aspecto:

void Run()
{
    try
    {
        while(true)
        {
            blockingQueue.Dequeue();
            doSomething();
        }
    }
    finally
    {
        countDownLatch.Signal();
    }
}

Soy consciente de que lo mejor que puede hacer en esta situación es utilizar un Thread regular, pero me pregunto si hay una manera ThreadPool equivalente a interrumpir un elemento de trabajo.

¿Fue útil?

Solución

¿Qué BlockingQueue es eso? Es que una clase BCL? clase TPL? O costumbre?

No importa; simplemente - no lo haría. Usted podría hacer algo temprano en la vida de la rosca para almacenar la referencia hilo, pero simplemente no se utilizaría el ThreadPool para este trabajo, ya que suena como que es ya funcionando. Un Thread regulares parece más adecuado.

También estoy sorprendido de que no existe un método incorporado de contar la cola de la liberación de todos los trabajadores - He escrito el bloqueo de colas antes, y que tienden a utilizar el patrón (por ejemplo, from aquí ):

public bool TryDequeue(out T value) {...}

con esto:

  • devolviendo true inmediatamente si hay datos
  • bloqueo y (eventualmente) devuelve true si no hay datos, pero algunos se añade
  • bloqueo y (eventualmente) devolver false si la cola se está cerrando
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top