Ich habe eine WinForms-Anwendung, die aus einem Haupt-UI-Thread und 4 Aufgaben besteht. Meine Hauptform verfügt über ein eigenes Mitglied Ebene Variable wie folgt aus:Schließen Formular mit laufenden Aufgaben
private bool keepThreadsRunning = false;
Im Load() Ereignis meiner Hauptform, ich habe folgendes:
keepThreadsRunning = true;
var task1Worker = Task.Factory.StartNew(() => DoStuff1());
var task2Worker = Task.Factory.StartNew(() => DoStuff2());
var task3Worker = Task.Factory.StartNew(() => DoStuff3());
var task4Worker = Task.Factory.StartNew(() => DoStuff4());
Innerhalb von jedem meiner DoStuff() Methoden, ich dies im Grunde haben:
while (keepThreadsRunning)
{
// do work here
Thread.Sleep(30000); // a couple of my tasks only need to run every 30 seconds or so
}
schließlich in meinem Form_Closing() Ereignishandler, habe ich folgendes:
keepThreadsRunning = false;
this.Close();
Wenn ich meine Anwendung im Task-Manager beobachte, scheint der Prozess zu enden, wenn ich mein Formular schließe, aber ich bin etwas verwirrt über die vier Aufgaben. Ist mein Aufruf zu this.Close() wirklich dazu führen, dass diese Aufgaben beendet werden (auch wenn sie in der Thread.Sleep() -Aufruf sind, wenn es passiert)? Und gibt es einen besseren Weg, dies zu erreichen, als die Art und Weise, wie ich es gerade schreibe?
BEARBEITEN - Ich habe kurz die Aufgabe abgebrochen (wenn meine App beendet wird), aber mein Verständnis ist, dass meine Aufgaben das Löschungs-Token regelmäßig überprüfen müssen, um festzustellen, ob sie abgebrochen wurden. Angesichts der Tatsache, dass einige meiner Aufgaben alle 30 Sekunden ausgeführt werden müssen, konnte ich nicht herausfinden, wie ich diese Wartezeit von 30 Sekunden implementieren würde (derzeit eine Thread.Sleep()) und die Aufgabe noch immer das Löschungs-Token überprüfen lassen würde.