déclaration ProblèmeComment mettre fin à un correctement thread de travail en C#
J'ai un thread de travail qui scanne essentiellement un dossier, d'entrer dans les fichiers qu'il contient, et dort ensuite pendant un certain temps. L'opération de numérisation peut prendre 2-3 secondes mais pas beaucoup plus. Je cherche un moyen d'arrêter ce fil avec élégance.
Précision: Je veux arrêter le fil alors qu'il est dormir, et non pendant qu'il est balayage. Cependant, le problème est que je ne sais pas quel est l'état actuel du thread. S'il dort, je veux qu'il sorte immédiatement. Si c'est la numérisation, je veux qu'il sorte du moment où il essaie de bloquer.
Les tentatives d'une solution
Au début, je mise en veille et d'interruption. Ensuite, j'ai découvert que l'interruption n'interrompt pas vraiment le sommeil - cela ne fonctionne que lorsque les threads essaye de dormir.
Donc, je suis passé à Monitor Wait & Pulse. Puis j'ai découvert que le Pulse ne fonctionne que lorsque je suis en attente. Alors maintenant j'ai un fil qui ressemble à ça:
while (m_shouldRun)
{
try
{
DoSomethingThatTakesSeveralSeconds();
lock (this)
{
Monitor.Wait(this, 5000);
}
}
catch (ThreadInterruptedException)
{
m_shouldRun = false;
}
}
Et maintenant j'ai besoin de créer ma fonction Stop. Alors j'ai commencé avec:
public void Stop()
{
m_shouldRun = false;
lock (this)
{
Monitor.Pulse(this);
}
thread.Join();
}
Mais cela ne fonctionne pas parce que je peux être pulsant pendant que les travaux de fil (alors qu'il est pas en attente). J'ai donc ajouté Interrompre:
public void Stop()
{
m_shouldRun = false;
thread.Interrupt();
lock (this)
{
Monitor.Pulse(this);
}
thread.Join();
}
Une autre option consiste à utiliser:
public void Stop()
{
m_shouldRun = false;
while (!thread.Join(1000))
{
lock (this)
{
Monitor.Pulse(this);
}
}
}
La question
Quelle est la méthode préférée? Y a-t-il une troisième méthode préférable?
« * Au début, j'utilisais sommeil et Interrompre Puis j'ai découvert Cette interruption n'interrompt pas vraiment le sommeil - elle ne fonctionne que lorsque les threads essaient de dormir. * "C'est étrange. Est-ce un bug connu? Si ce n'est pas le cas, pouvez-vous essayer de le reproduire avec un exemple de jouet? – Heinzi