Laden...

Wie kann ich einen gestarteten Prozess wieder abbrechen?

Erstellt von Rico913 vor 3 Jahren Letzter Beitrag vor 3 Jahren 1.061 Views
R
Rico913 Themenstarter:in
95 Beiträge seit 2020
vor 3 Jahren
Wie kann ich einen gestarteten Prozess wieder abbrechen?

Hi,

ich möchte ein Process Robocopy starten und mit Hilfe von nochmaligen Click auf den Button die Aktion abbrechen. Der Process startet sauber, aber ich kann diesen nicht abbrechen.
Es erscheint folgende Fehlermeldung:> Fehlermeldung:

"Diesem Objekt ist kein Prozess zugeordnet."

Mein Code:



            Process p = new Process();
            p.StartInfo.WindowStyle = ProcessWindowStyle.Minimized;
            p.StartInfo.FileName = "robocopy.exe";
            p.StartInfo.Arguments = arg;

            
            if (Counter % 2 == 1)
            {
                label3.Text = "Quelle: " + DateiAnzahl_Quelle.ToString();
                if (!Directory.Exists(Ziel))
                {
                    Directory.CreateDirectory(Ziel);
                }
                p.Start();

                Tim_ProgressBarTIFcopy.Interval = Convert.ToInt32(TickIntervall);
                Tim_ProgressBarTIFcopy.Enabled = true;
            }
            else
            {
                Tim_ProgressBarTIFcopy.Enabled = false;
                progressBar1.Value = 0;
                CmdImgCopy.Text = "Bilder kopieren";
                if (!p.HasExited)
                {
                    p.Kill();
                }
                
            }

Danke schon mal....

R
Rico913 Themenstarter:in
95 Beiträge seit 2020
vor 3 Jahren

Abgesehen davon, dass wir mir gerade klar geworden ist, es kein Sinn Macht stur gerade/ungerade zu zählen. Was, wenn der Prozess sauber läuft und der nächste gestartet wird - dann wird abgebrochen 🤔

Vielleicht habt ihr ne Idee, wie ich das Abrechen umsetzen kann, vielleicht innerhalb des Timers (Wenn Click auf Button dann Timer.Tick = false)?

16.807 Beiträge seit 2008
vor 3 Jahren

Warum die Fehlermeldung auftaucht kannst Du sehr einfach selbst der Dokumentation entnehmen.
Process.HasExited

R
Rico913 Themenstarter:in
95 Beiträge seit 2020
vor 3 Jahren

Aber RoboCopy läuft doch lokal - meinst du das?

16.807 Beiträge seit 2008
vor 3 Jahren

🤔 Nein.

Du hast nach der Fehlermeldung gefragt. Diese Fehlermeldung, und was sie auslöst, ist in der Dokumentation beschrieben => es fehlt das Handle.
Offenbar hast Du Dir da die Funktionsweise der Process-Klasse noch nicht wirklich angeschaut - und eben auch nicht was die entsprechende Exception bedeutet.
Daher hab ich Dir dazu die Dokumentation verlinkt.

Da siehst Du, dass Kill() immer diese Exception auslösen kann und HasExited keine 100% Garantie gibt, dass der Prozess noch läuft oder nicht.
Einfacher Grund:

  • Zwischen der Abfrage von Exited und dem Kill kann der Prozess beendet sein. Damit wird folgerichtig die Exception geworfen.
  • Es fehlt das Handle, weil Du nicht direkt die Exe gestartet hast.

Ergo: Du musst immer die Exceptions abfangen.
Übrigens sollte sich die Instanz von Process auch immer in einem using() befinden.

Nun zum Fehler:

Ich finde es auch etwas schade, dass Du Dich offenbar nicht so wirklich an den anderen Codes orientieren magst.
Dort finde ich nämlich überall noch folgendes:
Fast alle verwenden UseShellExecute false, was bei Dir nicht der Fall ist.
Da der Standard true ist verwenden Process eine Shell um RoboCopy zu starten; das dürfte der Grund sein, wieso Du kein Handle mehr hast und die Exception geworfen wird.

Ich hab auch bisschen die Vermutung, dass Du Deinen Code stur komplett in eine Datei schreibst und daher etwas die Übersicht verloren hast, was wo wir passiert.
Schau doch, dass Du bisschen Ordnung in den Code bekommst und Dich evtl an [Artikel] Drei-Schichten-Architektur orientierst.

Also: profitier doch davon, dass schon Code existiert, der offenbar auch von mehreren Leuten schon verwendet wurde - und es entsprechendes Feedback gibt.
Lern davon, adaptier den Code auf Dich, befass Dich damit, was Du da eigentlich schreibst und warum andere das so geschrieben haben - und dann wird das schon klappen! =)

D
261 Beiträge seit 2015
vor 3 Jahren

Außerdem speicherst du dir die Referenz auf das Process-Objekt nicht (und somit auch das Handle nicht). Jeder Klick auf den Button legt eine neue Instanz an.