Verwenden von Visual C#, um auf den Abschluss einer Shellanwendung zu warten

In diesem Artikel erfahren Sie, wie Sie die Microsoft .NET Framework-Klasse Process verwenden, um eine andere Anwendung aus Ihrem Code zu starten und den Code auf das Schließen der anderen Anwendung warten zu lassen, bevor sie fortgesetzt wird.

Ursprüngliche Produktversion: Visual C# .NET
Ursprüngliche KB-Nummer: 305369

Zusammenfassung

Wenn der Code auf den Abschluss der Anwendung wartet, gibt es zwei Optionen:

  • Warten Sie unbegrenzt, bis die andere Anwendung entweder abgeschlossen oder vom Benutzer geschlossen wird.
  • Geben Sie einen Timeoutzeitraum an, nach dem Sie die Anwendung aus Ihrem Code schließen können.

In diesem Artikel werden zwei Codebeispiele vorgestellt, die beide Ansätze veranschaulichen. Darüber hinaus lässt das Timeoutbeispiel die Möglichkeit zu, dass die andere Anwendung möglicherweise nicht mehr reagiert (aufgehängt) und führt die erforderlichen Schritte aus, um die Anwendung zu schließen.

Dieser Artikel bezieht sich auf den folgenden .NET Framework Klassenbibliothek-Namespace System.Diagnostics.

Namespaces einschließen

Sie sollten den Namespace für die Process -Klasse importieren, bevor Sie die folgenden Beispiele ausführen. Platzieren Sie die folgende Codezeile vor der Namespace- oder Class-Deklaration, die das Codebeispiel enthält:

using System.Diagnostics;

Warten Sie unbegrenzt, bis die Shellanwendung abgeschlossen ist.

Im folgenden Codebeispiel wird eine andere Anwendung (in diesem Fall Editor) gestartet und auf unbestimmte Zeit gewartet, bis die Anwendung geschlossen wird:

//How to Wait for a Shelled Process to Finish
//Get the path to the system folder.
string sysFolder=
Environment.GetFolderPath(Environment.SpecialFolder.System);
//Create a new process info structure.
ProcessStartInfo pInfo = new ProcessStartInfo();
//Set the file name member of the process info structure.
pInfo.FileName = sysFolder + @"\eula.txt";
//Start the process.
Process p = Process.Start(pInfo);
//Wait for the window to finish loading.
p.WaitForInputIdle();
//Wait for the process to end.
p.WaitForExit();
MessageBox.Show("Code continuing...");

Bereitstellen eines Timeouts für die Shellanwendung

Im folgenden Codebeispiel wird ein Timeout für die Shellanwendung festgelegt. Das Timeout für das Beispiel ist auf 5 Sekunden festgelegt. Sie können diese Zahl (die in Millisekunden berechnet wird) für Ihre Tests anpassen.

//Set a time-out value.
int timeOut=5000;
//Get path to system folder.
string sysFolder=
    Environment.GetFolderPath(Environment.SpecialFolder.System);
//Create a new process info structure.
ProcessStartInfo pInfo = new ProcessStartInfo();
//Set file name to open.
pInfo.FileName = sysFolder + @"\eula.txt";
//Start the process.
Process p = Process.Start(pInfo);
//Wait for window to finish loading.
p.WaitForInputIdle();
//Wait for the process to exit or time out.
p.WaitForExit(timeOut);
//Check to see if the process is still running.
if (p.HasExited == false)
    //Process is still running.
    //Test to see if the process is hung up.
    if (p.Responding)
        //Process was responding; close the main window.
        p.CloseMainWindow();
    else
        //Process was not responding; force the process to close.
        p.Kill();
    MessageBox.Show("Code continuing...");

Problembehandlung

Manchmal kann es schwierig sein, zwischen diesen beiden Optionen zu wählen. Der Hauptzweck eines Timeouts besteht darin, zu verhindern, dass Ihre Anwendung hängen bleibt, da die andere Anwendung nicht mehr reagiert hat. Timeouts eignen sich besser für eine Shellanwendung, die eine Hintergrundverarbeitung durchführt, bei der der Benutzer möglicherweise nicht weiß, dass die andere Anwendung angehalten wurde oder nicht über eine bequeme Möglichkeit zum Schließen verfügt.