ProblemstellungWie ein Worker-Thread richtig in C#
Ich habe einen Worker-Thread zu beenden, die im Grunde einen Ordner durchsucht, gehen in die Akten innerhalb und schlafen dann für eine Weile. Der Scanvorgang dauert 2-3 Sekunden, aber nicht viel mehr. Ich suche nach einer Möglichkeit, diesen Faden elegant zu stoppen.
Klärung: Ich möchte den Faden zu stoppen, während es Schlaf, ist und nicht, wenn esScannen ist. Das Problem ist jedoch, dass ich nicht weiß, was der aktuelle Status des Threads ist. Wenn es schläft, möchte ich es sofort verlassen. Wenn es scannt, möchte ich, dass es den Moment beendet, wenn es versucht zu blockieren.
Versuche einer Lösung
Zuerst war ich mit Schlaf und Interrupt. Dann habe ich herausgefunden, dass Interrupt den Schlaf nicht wirklich unterbricht - es funktioniert nur, wenn die Threads versuchen, in den Schlaf zu gehen.
Also wechselte ich auf Monitor Warten & Pulse. Dann habe ich herausgefunden, dass der Pulse nur funktioniert, wenn ich tatsächlich in der Wartestellung bin. So, jetzt habe ich einen Faden, 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 Handwerk. Also begann ich mit:
public void Stop()
{
m_shouldRun = false;
lock (this)
{
Monitor.Pulse(this);
}
thread.Join();
}
Aber das funktioniert nicht, weil ich während der Faden Werke pulsieren werden kann (während es nicht zu warten). So habe ich Interrupt:
public void Stop()
{
m_shouldRun = false;
thread.Interrupt();
lock (this)
{
Monitor.Pulse(this);
}
thread.Join();
}
Eine weitere Option ist die Verwendung:
public void Stop()
{
m_shouldRun = false;
while (!thread.Join(1000))
{
lock (this)
{
Monitor.Pulse(this);
}
}
}
Die Frage
Was ist die bevorzugte Methode? Gibt es eine dritte Methode, die vorzuziehen ist?
„* Zuerst I Sleep and Interrupt wurde mit Dann fand ich heraus, Dieser Interrupt unterbricht den Schlaf nicht wirklich - er funktioniert nur, wenn die Threads versuchen, schlafen zu gehen. * "Das ist seltsam. Ist das ein bekannter Fehler? Wenn nicht, können Sie versuchen, es mit einem Spielzeugbeispiel zu reproduzieren? – Heinzi