C # Thread-Erstellungsfrage

7

Beim Erstellen einer neuen System.Thread-Instanz ist der Standardwert von IsBackground falsch. Kann jemand das Licht darauf werfen, warum das der Standardwert wäre, wäre das nicht wahr. Meine Neigung, richtig oder nicht, beim Erstellen eines Threads ist, dass es im Hintergrund des Hauptthreads ausgeführt würde.

Danke für die schnellen Antworten.

Ich stelle Funktionalität im Destruktor meiner Komponente zur Verfügung, damit der Thread ordnungsgemäß beendet werden kann. Ich verwende eine ManualResetEvent und Join .

Ich verstehe vollständig, dass das korrekte Beenden des Threads richtig und korrekt ist. Was ich nicht vorstelle, ist der Grund. Standardmäßig muss ein Thread eine gesamte Anwendung hängen, wenn sie beim Beenden der Anwendung nicht erfolgreich beendet wird.

    
gooch 10.11.2009, 23:46
quelle

5 Antworten

22

IsBackground bedeutet, dass der Thread beendet wird , wenn die Anwendung beendet wird. Dies ist selten wünschenswert Verhalten, weil es bedeutet, dass Thread nicht ordnungsgemäß stoppen und aufräumen kann.

Stattdessen sollte die App dem Thread signalisieren, dass er beendet werden soll, bis er dies getan hat und dann ordnungsgemäß schließt.

Das ist meine Zusammenfassung dieses Klappentexts aus dem Thread.IsBackground MSDN Artikel :

  

Ein Thread ist entweder ein Hintergrund-Thread   oder ein Vordergrund-Thread. Hintergrund   Fäden sind identisch mit Vordergrund   Threads, außer diesem Hintergrund   Threads verhindern einen Prozess nicht   Beenden. Einmal im Vordergrund   Threads, die zu einem Prozess gehören   beendet, die gemeinsame Sprache   Laufzeit beendet den Prozess. Irgendein   verbleibende Hintergrundfäden sind   gestoppt und nicht abgeschlossen.

    
Neil Barnwell 10.11.2009, 23:47
quelle
4

Diese Informationen werden auf der MSDN-Seite unter IsBackground erläutert der Unterschied zwischen Hintergrund- und Vordergrund-Threads.

  

Ein Thread ist entweder ein Hintergrund-Thread oder ein Vordergrund-Thread. Hintergrundthreads sind mit Vordergrundthreads identisch, mit der Ausnahme, dass Hintergrundthreads nicht verhindern, dass ein Prozess beendet wird. Sobald alle zu einem Prozess gehörenden Vordergrund-Threads beendet sind, beendet die Common Language Runtime den Prozess. Alle verbleibenden Hintergrundthreads werden gestoppt und nicht abgeschlossen.

    
ChrisF 10.11.2009 23:49
quelle
2

Wenn Sie in .NET einen eigenen Thread erstellen, wird dies in der Regel für einen lang andauernden Prozess verwendet. In dieser Situation möchten Sie normalerweise nicht, dass der Thread zerstört wird, wenn der Benutzer Ihr Hauptformular schließt. Stattdessen sollten Sie eine gute Chance haben, die Bereinigung ordnungsgemäß durchzuführen.

Wenn Sie nur ein schnelles Arbeitselement in einem Hintergrund-Thread ausführen möchten, verwenden Sie den ThreadPool. Dies ist in der Regel viel besser für alles, was kein lang laufendes Arbeitselement ist.

    
Reed Copsey 11.11.2009 00:01
quelle
2

Das Konzept von Vordergrund und Hintergrund kann etwas verwirrend sein. Wie andere darauf hingewiesen haben, beeinflusst der Hintergrundaspekt nur, ob die Laufzeit den Prozess herunterfahren wird oder nicht. Wenn keine Vordergrund-Threads verbleiben, wird der Prozess unabhängig von der Anzahl der ausgeführten Hintergrund-Threads beendet, sobald der letzte Vordergrund-Thread beendet wird.

Wie bei neuen Threads, die "im Hintergrund des Hauptthreads" laufen, ist das nicht wirklich der Fall. Jeder neue Thread hat standardmäßig die gleiche Priorität wie Ihr Hauptthread, daher werden sie genauso häufig geplant wie der Hauptthread und der Hauptthread erhält daher keine spezielle Behandlung in diesem Sinne. Threads werden basierend auf Priorität geplant und nicht ob sie Vordergrund- oder Hintergrundthreads sind.

Sie können natürlich sowohl den Hintergrund / Vordergrund als auch die Priorität neuer Threads festlegen, der Standardwert ist jedoch, dass neue Threads dem ursprünglichen Thread entsprechen.

    
Brian Rasmussen 11.11.2009 00:37
quelle
0
  

& gt;    Ich verstehe vollständig, dass das korrekte Beenden des Threads richtig und korrekt ist, aber was ich vermisse ist, dass ein Thread standardmäßig eine ganze Anwendung aufhängen muss, wenn sie nicht erfolgreich beendet wird.   & lt; & lt;

Wenn diese Hintergrundthreads nicht sehr harmlos sind, ist es möglicherweise besser, den Prozess aufzuhängen (für eine Weile - bis sie beendet werden), als sie zum Herunterfahren zu zwingen - wenn Sie Hintergrundthreads machen, haben Sie keine Kontrolle darüber, was sie tun, wenn sie aussteigen. Eine Alternative wäre, die Aufgaben zu verfolgen, die Sie in "Hintergrund" -Threads ausgeführt haben. Wenn der Hauptthread heruntergefahren werden soll, sollte er den abzustellenden Threads signalisieren und ihnen die Möglichkeit geben, elegant zu beenden. Wenn sie nicht ordnungsgemäß beendet werden, können Sie sie abbrechen (oder sie als Hintergrund festlegen lassen, aber den Hauptthread erst beenden, wenn Sie die Hintergrundthreads beenden möchten). Bedenken Sie jedoch, dass etwas Schlimmes passieren kann, wenn Sie einen Thread abbrechen - wenn er in eine Datei schreibt, dann ist die Datei wahrscheinlich beschädigt, usw.

    
JMarsch 11.11.2009 00:17
quelle

Tags und Links