Ich versuche, einen ThreadManager für meine C# -Anwendung zu schreiben. Ich erstelle mehrere Threads:
Ein Thread für meinen Textschreiber.
Ein Thread, der einige Statistiken überwacht.
Mehrere Threads, um eine große Reihe von Berechnungen durchzuführen (bis zu 4 Threads pro Kern und ich meine App auf einem 2x Quad-Core-Server laufen).Herunterfahren einer Multithread-Anwendung
Meine Anwendung läuft normalerweise für bis zu 24 Stunden auf einmal, so dass alle Threads am Anfang erstellt werden und sie bestehen während der gesamten Zeit, die die App ausgeführt wird.
Ich möchte einen einzigen Ort haben, an dem ich alle meine Schritte "registriere" und wenn die Anwendung heruntergefahren wird, rufe ich einfach eine Methode auf und sie durchläuft alle registrierten Threads und schließt sie ab.
Zu diesem Zweck ich die folgende Klasse entwickelt haben:
public class ThreadManager
{
private static Object _sync = new Object();
private static ThreadManager _instance = null;
private static List<Thread> _threads;
private ThreadManager()
{
_threads = new List<Thread>();
}
public static ThreadManager Instance
{
get
{
lock (_sync)
{
if (_instance == null)
{
_instance = new ThreadManager();
}
}
return _instance;
}
}
public void AddThread(Thread t)
{
lock (_sync)
{
_threads.Add(t);
}
}
public void Shutdown()
{
lock (_sync)
{
foreach (Thread t in _threads)
{
t.Abort(); // does this also abort threads that are currently blocking?
}
}
}
}
Ich möchte sicherstellen, dass alle meine Fäden getötet werden, so kann die Anwendung richtig schließen und in der Mitte einige Berechnung heruntergefahren ist gerade fein auch. Sollte mir hier etwas bekannt sein? Ist dieser Ansatz angesichts meiner Situation gut?
WOW! Viele gute Antworten ... es ist schwer zu wählen. Ich gab Nate das Häkchen, weil er der Erste war, und es wäre ungerecht, ihn ihm wegzunehmen. Mal sehen, was die Stimmen sagen. Ich bekomme etwas nützliches von all deinen Antworten, also stimme bitte mit deinen Herzen. – Kiril
Das Standardverhalten von Thread-Pool-Threads entspricht dem von mir vorgeschlagenen. Wenn es dir egal ist, dass deine Threads nicht zu Ende gehen, ist meins die einfachste Lösung. Offensichtlich machen die anderen Antworten gute Argumente für die Verwaltung von Threads, aber Sie geben explizit an, dass das Töten von Threads mitten in einer Berechnung in Ordnung ist. –
Ich stimme dir zu Nate;), ich werde das Häkchen nicht wegnehmen, weil es unfair wäre und du mir die genaueste, schnelle und einfache Antwort gegeben hast ... Ich möchte, dass andere Leute fair werden Kredit, also möchte ich, dass jeder für alle guten Antworten stimmt. – Kiril