Process.Exited Evento

Definizione

Si verifica al termine di un processo.

public event EventHandler Exited;

Tipo evento

Esempio

Nell'esempio di codice seguente viene creato un processo che stampa un file. Genera l'evento Exited quando il processo viene chiuso perché la EnableRaisingEvents proprietà è stata impostata al momento della creazione del processo. Il Exited gestore eventi visualizza le informazioni sul processo.

using System;
using System.Diagnostics;
using System.Threading.Tasks;

class PrintProcessClass
{
    private Process myProcess;
    private TaskCompletionSource<bool> eventHandled;

    // Print a file with any known extension.
    public async Task PrintDoc(string fileName)
    {
        eventHandled = new TaskCompletionSource<bool>();

        using (myProcess = new Process())
        {
            try
            {
                // Start a process to print a file and raise an event when done.
                myProcess.StartInfo.FileName = fileName;
                myProcess.StartInfo.Verb = "Print";
                myProcess.StartInfo.CreateNoWindow = true;
                myProcess.EnableRaisingEvents = true;
                myProcess.Exited += new EventHandler(myProcess_Exited);
                myProcess.Start();
            }
            catch (Exception ex)
            {
                Console.WriteLine($"An error occurred trying to print \"{fileName}\":\n{ex.Message}");
                return;
            }

            // Wait for Exited event, but not more than 30 seconds.
            await Task.WhenAny(eventHandled.Task,Task.Delay(30000));
        }
    }

    // Handle Exited event and display process information.
    private void myProcess_Exited(object sender, System.EventArgs e)
    {
        Console.WriteLine(
            $"Exit time    : {myProcess.ExitTime}\n" +
            $"Exit code    : {myProcess.ExitCode}\n" +
            $"Elapsed time : {Math.Round((myProcess.ExitTime - myProcess.StartTime).TotalMilliseconds)}");
        eventHandled.TrySetResult(true);
    }

    public static async Task Main(string[] args)
    {
        // Verify that an argument has been entered.
        if (args.Length <= 0)
        {
            Console.WriteLine("Enter a file name.");
            return;
        }

        // Create the process and print the document.
        PrintProcessClass myPrintProcess = new PrintProcessClass();
        await myPrintProcess.PrintDoc(args[0]);
    }
}

Commenti

L'evento Exited indica che il processo associato è terminato. Questa occorrenza indica che il processo è terminato (interrotto) o è stato chiuso correttamente. Questo evento può verificarsi solo se il valore della EnableRaisingEvents proprietà è true.

Esistono due modi per ricevere una notifica quando il processo associato viene chiuso: in modo sincrono e asincrono. La notifica sincrona significa chiamare il metodo per bloccare il WaitForExit thread corrente fino all'uscita del processo. La notifica asincrona usa l'evento, che consente al thread chiamante di continuare l'esecuzione Exited nel frattempo. In quest'ultimo caso, EnableRaisingEvents deve essere impostato su true per l'applicazione chiamante per ricevere l'evento Exited.

Quando il sistema operativo arresta un processo, notifica tutti gli altri processi che hanno registrato gestori per l'evento Exited. In questo momento, l'handle del processo appena chiuso può essere usato per accedere ad alcune proprietà, ad ExitTime esempio e HasExited che il sistema operativo mantiene fino a quando non rilascia completamente tale handle.

Nota

Anche se si dispone di un handle per un processo chiuso, non è possibile chiamare Start di nuovo per riconnettersi allo stesso processo. La chiamata Start rilascia automaticamente il processo associato e si connette a un processo con lo stesso file ma completamente nuovo Handle.

Per altre informazioni sull'uso dell'evento Exited nelle applicazioni Windows Forms, vedere la SynchronizingObject proprietà .

Si applica a

Prodotto Versioni
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1