C# Prozess automatisch beenden

Denke ich auch.

Wenn du die Prozess-Instanz im Parent hälst und dieser wird beendet, wollten auch alle Sub-Prozesse mitgezoben werden.

Wie startest du denn die anderen Prozesse?
 
Also ich starte sie über die Klasse Process und lege dazu eine ProcessInfo an (Datei, Pfad usw.)
UseShellExecute = false
RedirectConsoleOut = true

Ich vermute, dass ich dieses Verhalten irgendwie erzwingen kann (Setting o. Ä.) aber bisher hab ich nichts gefunden.
 
Ja, aber wie startest du? Legst du eine Prozess-Instanz an und ruft die Instanzmethode Start auf oder nutzt du die statische Methode Start?
 
Herje, muss man denn alle Infos erfragen? :confused:

hälst du auch die Referenzen?

Poste doch bitte den Code, dann kann mans auch sehen
 
Hi,
kann man das nicht auch netter schreiben?

Der Programmaufruf erfolgt so:

Code:
						//String zum aufnehmen der einzelnen Argument
						string arg = Environment.ExpandEnvironmentVariables(EnvironmentVariables);

						//Prozessinformationen zusammenstellen
						p.StartInfo.UseShellExecute = false;
						p.StartInfo.RedirectStandardOutput = true;
                        p.StartInfo.RedirectStandardError = true;
                        p.StartInfo.RedirectStandardInput = true;

						p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
						p.StartInfo.CreateNoWindow = false;
						p.StartInfo.FileName = JrePath + FileToExecute;
						
						if(WorkingDirectory != "")
						{
							p.StartInfo.WorkingDirectory = WorkingDirectory;
							Environment.CurrentDirectory = WorkingDirectory;
						}
						p.StartInfo.Arguments = arg;
						
						p.Start();

Das Objekt p "behalte" ich und prüfe mit p.hasExited alle 30 Sekunden, ob er noch läuft.
Das lesen der Ausgaben mache ich asynchron mit

p.OutputDataReceived += new DataReceivedEventHandler(standardOutHandler);
 
Hi

Hi,
kann man das nicht auch netter schreiben?
Ja kann man, sorry!

2 Topic:
Du hälst die Referenzen auch in einer List?!

Hast du es mal probiert, die Methode OnStop zu überschreiben?

Problem ist, dass Process intern unmanged ist bzw. unmanaged Ressourcen nutzt. Die Runtime kann im Falle eines Absturzes aber nur den verwalteten Teil wegräumen. Deine Prozess sind jedoch nicht verwaltet (jedenfalls nicht durch .NET)
 
Die Variable p ist teil einer Klasse und für jeden Prozess instanziere ich ein Objekt von dieser Klasse (also in meinem konkreten Fall sind es 5 Objekte).

OnStop wird meines Wissens nicht im Fehlerfall ausgeführt (korrigier mich, wenn ich falsch liege)

Wie sieht es mit dem Destructor aus?

Ich bin nun auf ein weiteres Problem gestoßen. Jetzt hab ich mein Programm in try-catch eingeschlossen, um jede Exception (die unerwarteterweise) nicht aufgefangen wird zu behandeln.

Aber: Ich habe ein Programm, welches wiederum einen Prozess startet (nicht von mir, ich hab keinen Einfluss auf die Entwicklung). Wenn ich nun p.kill aufrufe wird nur der von mir gestartete Prozess gekillt. Der andere wird vom System übernommen und weitergeführt.

Habe schon auf englischen Seiten nach Orphan Processes gesucht, aber leider nichts gefunden. Andere Programme machen es doch auch so, deswegen kann es ja nicht so schwer sein oO

Stell ich mich einfach nur zu dumm an?
 
Wäre es denn sonst eine Alternative für dich beim Start deines Dienstes zu überprüfen ob noch alte Programme laufen und in diesem Fall keine Neuen zu starten, sondern die alten Instanzen "wiederzuverwenden" (falls das geht)?
 
Zurück