Laden...

Umgang mit erzeugten Hintergrundprozessen bzgl. Dispose

Erstellt von Solix0x vor 3 Jahren Letzter Beitrag vor 3 Jahren 971 Views
S
Solix0x Themenstarter:in
12 Beiträge seit 2018
vor 3 Jahren
Umgang mit erzeugten Hintergrundprozessen bzgl. Dispose

Hallo^^ Ich habe nur eine Frage zu folgendem. Die Klasse Process implementiert IDisposable und daher sollte man Dispose aufrufen oder ein using Statement benutzen. Nun möchte ich einen Autostarter für Prozesse programmieren. Der lädt einfach die Zeilen aus einer csv Datei aus. In einer Zeile steht der Pfad zur exe Datei und ein bool Wert, ob diese exe von meinem Autostarter gestartet werden soll und noch ein bool Wert (IsBackground), ob der Autostarter warten soll, bis das Programm beendet ist. Wenn IsBackground true ist, dann soll der Autostarter nicht warten und den nächsten Prozess/das nächste Programm starten.


foreach (var program in programs)
{
    using var process = Process.Start(new ProcessStartInfo
    {
	// ...
    });

    if (!program.IsBackground)
	process?.WaitForExit();
}

Wenn es kein Hintergrundprogramm ist, dann kann der Autostarter auf das Programm warten und Dispose aufrufen. Aber wie gehe ich in dem anderen Fall, dass es einer ist damit um?

D
261 Beiträge seit 2015
vor 3 Jahren

Du speicherst dir die Referenz, abonnierst das Process.Exited Ereignis (System.Diagnostics) und rufst im Handler Dispose auf.

T
2.224 Beiträge seit 2008
vor 3 Jahren

Im einfachsten fall machst du dies entweder in dem du mit Parallel.ForEach arbeitest, dann kann deine Methode über Tasks aufgerufen werden.
Oder wenn du es selbst steuern will, in dem du z.B. eine StartProgramAsync Methode anlegst, die dann einen Task liefert.
Somit können die Programme asychron gestartet werden.

Doku Asychnrone Programmierung
Doku Parallel.ForEach

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

6.911 Beiträge seit 2009
vor 3 Jahren

Hallo T-Virus,

sicher dass hier Parallel.ForEach hier angebracht ist?
Ich finde den Vorschlag von dannoe da passender.

Das könnte dann beliebig ausgebaut werrden. Z.B. mit einer TaskCompletionSource so dass ein Task vorhanden ist. Od. so dass await möglich ist, usw.
Aber für die Aufgabenstellung ist dannoes Vorschlag einfach und effektiv -- mehr braucht es nicht.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

T
2.224 Beiträge seit 2008
vor 3 Jahren

@gfoidl
Hatte den Ansatz falsch verstanden.
Ich hatte gedacht, es geht nur darum die Prozesse parallel zu starten ohne zu warten.
Macht dann tatsächlich keinen Sinn.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

S
Solix0x Themenstarter:in
12 Beiträge seit 2018
vor 3 Jahren

Du speicherst dir die Referenz, abonnierst das
>
und rufst im Handler Dispose auf.

Ah daran habe ich echt nicht gedacht, weil ich keinen * gesehen habe xD Danke noch mal dafür, ist eine gute Lösung