So beenden Sie einen Worker-Thread korrekt in c #

Problemstellun

Ich habe einen Arbeitsthread, der im Grunde genommen einen Ordner durchsucht, die darin enthaltenen Dateien durchsucht und dann eine Weile ruht. Der Scanvorgang kann 2-3 Sekunden dauern, dauert jedoch nicht viel länger. Ich suche nach einer Möglichkeit, diesen Thread elegant zu beenden.

Klärun: Ich möchte den Thread anhalten, während er @ isSchlafe und nicht solange es @ i scan. Das Problem ist jedoch, dass ich nicht weiß, wie der aktuelle Status des Threads ist. Wenn es schläft, möchte ich, dass es sofort verschwindet. Wenn es sich um einen Scanvorgang handelt, soll der Vorgang beendet werden, sobald versucht wird, ihn zu blockieren.

Versuche zu einer Lösung

Zunächst habe ich Sleep and Interrupt verwendet. Dann habe ich herausgefunden, dass Interrupt den Schlaf nicht wirklich unterbricht - es funktioniert nur, wenn die Threads VERSUCHEN, in den Schlaf zu gehen.

So wechselte ich zu Monitor Wait & Pulse. Dann fand ich heraus, dass der Puls nur funktioniert, wenn ich tatsächlich im Warten bin. Also jetzt habe ich einen Thread, der so aussieht:

while (m_shouldRun)
{
    try
    {
        DoSomethingThatTakesSeveralSeconds();
        lock (this)
        {
            Monitor.Wait(this, 5000);
        }
    }
    catch (ThreadInterruptedException)
    {
        m_shouldRun = false;
    }
}

Und jetzt muss ich meine Stop-Funktion herstellen. Also habe ich angefangen mit:

public void Stop()
{
    m_shouldRun = false;
    lock (this)
    {
        Monitor.Pulse(this);
    }
    thread.Join();
}

Aber das funktioniert nicht, weil ich möglicherweise pulsiere, während der Thread funktioniert (während er nicht wartet). Also habe ich Interrupt hinzugefügt:

public void Stop()
{
    m_shouldRun = false;
    thread.Interrupt();
    lock (this)
    {
        Monitor.Pulse(this);
    }
    thread.Join();
}

Eine weitere Option ist:

public void Stop()
{
    m_shouldRun = false;
    while (!thread.Join(1000))
    {
        lock (this)
        {
            Monitor.Pulse(this);
        }
    }
}

Die Frag

Was ist die bevorzugte Methode? Gibt es eine dritte Methode, die vorzuziehen ist?

Antworten auf die Frage(8)

Ihre Antwort auf die Frage