Ich habe kürzlich einen Produktionscode mit folgendem Effekt gesehen:
%Vor%Macht das irgendeinen Sinn? Intuitiv, wenn der Prozess beendet wurde, kann kein Code darin laufen.
Wenn nicht, was wäre eine gute Möglichkeit zu sagen, ob der aktuelle Prozess beendet wird?
Wenn es von Belang sein kann, war der Anwendungsfall dafür, dass Behauptungen wie Objekte, die nicht entsorgt wurden, wenn der Prozess beendet wird, vermieden werden.
Beim Überprüfen des Quellcodes von IsExited
stellt sich heraus, dass nichts Spektakuläres passiert. IsExited
fragt das Betriebssystem, ob der Prozess beendet wurde und was der Exit-Code war. Das war's.
Das ganze Thema der Ausgabeumleitung gilt nicht.
Der Code, den Sie dort gefunden haben, wird immer als falsch bewertet. Entferne es und finde heraus, wer es geschrieben hat, um zu fragen, was er meinte. Wahrscheinlich ein Missverständnis.
Von Thread.IsBackground
:
Nachdem alle zu einem Prozess gehörenden Vordergrund-Threads beendet wurden, beendet die Common Language Runtime den Prozess. Alle verbleibenden Hintergrundthreads werden gestoppt und nicht abgeschlossen.
Für mich bedeutet das, dass kein Thread jemals Code ausführen wird, wenn der Prozess beendet wurde.
Was die Aussage von Process.HasExited betrifft:
Wenn die Standardausgabe an asynchrone Ereignishandler umgeleitet wurde, ist es möglich, dass die Ausgabeverarbeitung nicht abgeschlossen wurde, wenn diese Eigenschaft true zurückgibt. Um sicherzustellen, dass die asynchrone Ereignisbehandlung abgeschlossen wurde, rufen Sie die Überladung WaitForExit () auf, die vor der Überprüfung von HasExited keinen Parameter enthält.
Ich glaube nicht, dass dies zutrifft, da die asynchronen Ereignisbehandlungsroutinen Threads im aktuellen Prozess sind und sie beendet werden, wenn der Prozess selbst beendet werden muss. Sie können nur ausgeführt werden, wenn sie an einen anderen Prozess angeschlossen sind.
Sie scheinen tatsächlich in der Lage zu sein, ein solches Szenario zu konstruieren:
Siehe den Hinweis in Ссылка :
Wenn die Standardausgabe an asynchrone Ereignishandler umgeleitet wurde, ist es möglich, dass die Ausgabeverarbeitung nicht abgeschlossen wurde, wenn diese Eigenschaft true zurückgibt. Um sicherzustellen, dass die asynchrone Ereignisbehandlung abgeschlossen wurde, rufen Sie die Überladung WaitForExit () auf, die vor der Überprüfung von HasExited keinen Parameter enthält.