Was ist der beste Weg, einen Thread signalisiert anderen Thread in .NET zu machen?
-
02-07-2019 - |
Frage
Ich brauche ein Thread haben ein anderes Signal, wenn der Benutzer die Ausführung zu unterbrechen möchte jedoch über Ich bin nicht sicher, wie die Signalisierung / Signal-Prüfmechanismus zu implementieren. Ich möchte nicht einen Singleton in meinem Projekt haben (wie eine globale bool
), aber gibt es eine Alternative?
dieses Thema Menschen legen nahe, geeignete Strukturen für den in C ++, aber ich weiß nicht, etwas ähnliches in .NET. Könnte jemand bitte etwas Licht?
Lösung
Versuchen Sie Background . Es unterstützt Fortschritte Updates und Löschung einer laufenden Task.
Wenn Sie einen Thread warten, bis ein anderer Thread seine Sache tut beendet hat, dann Monitor.Wait und Monitor.Pulse sind gut, wie Manual. Diese sind jedoch nicht wirklich von Nutzen für eine laufende Aufgabe abgebrochen wird.
Wenn Sie Ihre eigene Stornierung Code schreiben, könnten Sie nur ein Feld irgendwo haben, die beide Threads Zugriff haben. Mark es flüchtig, z.
private volatile bool cancelling;
Haben Sie den Haupt-Thread es auf true gesetzt, und haben die Arbeiter-Thread es in regelmäßigen Abständen überprüfen und es auf false gesetzt, wenn es fertig ist.
Das ist nicht wirklich vergleichbar einer ‚globalen Variablen‘ zu haben, wie Sie noch den Umfang der Semaphor Variable begrenzen kann zu einer Klasse privat sein.
Andere Tipps
Ein bisschen vage (kurze Zeit), aber schauen Sie in Manual und Autoreset . Sie könnten auch sehen Monitor- und Schloss Schlüsselwort möchten.
Schauen Sie in Monitor.Wait und Monitor.Pulse. Hier ist ein ausgezeichneter Artikel über Threading in .Net (sehr gut lesbar): http: //www.albahari .com / Einfädeln / part4.aspx
Eine einfache Lösung, wie eine synchronisierte statische boolean, sollte alles, was Sie brauchen, um zu einem Rahmen-basierte Lösung gegenüber, die für Ihr Szenario zu viel des Guten copuld. Falls Sie noch einen Rahmen, einen Blick auf die parallel Erweiterungen für Ideen .NET .
Es hängt davon ab, welche Art der Synchronisation Sie benötigen. Wenn Sie in der Lage sein wollen Thread in einer Schleife, bis eine Art Ende der Ausführung laufen erreicht ist - alles, was Sie brauchen, ist eine statische Bool Variable. Wenn Sie einen Thread wollen, bis ein anderer Thread warten, um einen Punkt in der Ausführung erreichen möchten Sie vielleicht WaitEvents (Autoreset oder Manual) verwenden. Iflyyou müssen für mehrere waithandles warten Sie WaitHandle.WaitAll oder WaitHandle.WaitAny verwenden können.
Sehen Sie sich die System.Runtime.Remoting Namespace.