Usare Visual C# per attendere il completamento di un'applicazione con shell

Questo articolo illustra come usare la classe Microsoft .NET Framework Process per avviare un'altra applicazione dal codice e fare in modo che il codice attenda la chiusura dell'altra applicazione prima che continui.

Versione originale del prodotto: Visual C# .NET
Numero KB originale: 305369

Riepilogo

Quando il codice attende il completamento dell'applicazione, sono disponibili due opzioni:

  • Attendere a tempo indeterminato che l'altra applicazione venga completata o chiusa dall'utente.
  • Specificare un periodo di timeout dopo il quale è possibile chiudere l'applicazione dal codice.

Questo articolo presenta due esempi di codice che illustrano entrambi gli approcci. Inoltre, l'esempio di timeout consente la possibilità che l'altra applicazione abbia smesso di rispondere (bloccata) e di eseguire i passaggi necessari per chiudere l'applicazione.

Questo articolo fa riferimento allo spazio dei nomi System.Diagnosticsdella libreria di classi .NET Framework seguente.

Includere gli spazi dei nomi

È necessario importare lo spazio dei nomi per la Process classe prima di eseguire gli esempi seguenti. Posizionare la riga di codice seguente prima della dichiarazione Namespace o Class che contiene l'esempio di codice:

using System.Diagnostics;

Attendere a tempo indeterminato il completamento dell'applicazione con shell

L'esempio di codice seguente avvia un'altra applicazione (in questo caso blocco note) e attende all'infinito la chiusura dell'applicazione:

//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...");

Specificare un timeout per l'applicazione con shell

Nell'esempio di codice seguente viene impostato un timeout per l'applicazione con shell. Il timeout per l'esempio è impostato su 5 secondi. È possibile modificare questo numero (calcolato in millisecondi) per il test.

//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...");

Risoluzione dei problemi

A volte può essere difficile scegliere tra queste due opzioni. Lo scopo principale di un timeout è quello di impedire il blocco dell'applicazione perché l'altra applicazione è bloccata. I timeout sono più adatti per un'applicazione shell che esegue l'elaborazione in background, in cui l'utente potrebbe non sapere che l'altra applicazione è bloccata o non ha un modo pratico per chiuderla.