Question

Supposons que j'ai mises en attente d'un élément de travail dans un ThreadPool, mais les blocs de poste de travail s'il n'y a pas de données à traiter (lecture d'un BlockingQueue). Si la file d'attente est vide et il n'y aura pas plus de travail entrant dans la file d'attente, alors je dois appeler la méthode Thread.Interrupt si je veux interrompre la tâche de blocage, mais comment on fait faire la même chose avec un ThreadPool?

Le code pourrait ressembler à ceci:

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

Je suis conscient que la meilleure chose à faire dans cette situation est d'utiliser un Thread régulière, mais je me demande s'il y a un moyen équivalent ThreadPool d'interrompre un élément de travail.

Était-ce utile?

La solution

Quelle BlockingQueue est-ce? Est-ce une classe BCL? classe TPL? Ou coutume?

Peu importe; tout simplement - je ne voudrais pas. Vous pourrait faire quelque chose au début de la vie pour stocker la référence de fil du fil, mais je voudrais tout simplement pas utiliser le ThreadPool pour ce travail comme il semble que cela est plus en cours d'exécution. Une Thread régulière semble plus approprié.

Je suis aussi surpris qu'il n'y a pas de méthode de dire la intégré file d'attente de libérer tous les travailleurs - j'ai les files d'attente de blocage écrit avant, et je tendance à utiliser le modèle (par exemple, from ):

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

avec ceci:

  • retour vrai immédiatement en cas de données
  • blocage et (éventuellement) le retour vrai s'il n'y a pas de données, mais certains est ajouté
  • blocage et (éventuellement) le retour false si la file d'attente est en cours de fermeture
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top