Condividi tramite


Process.Exited Evento

Definizione

Si verifica al termine di un processo.

public:
 event EventHandler ^ Exited;
public event EventHandler Exited;
member this.Exited : EventHandler 
Public Custom Event Exited As EventHandler 

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]);
    }
}
Imports System.Diagnostics

Class PrintProcessClass

    Private WithEvents myProcess As Process
    Private eventHandled As TaskCompletionSource(Of Boolean)

    ' Print a file with any known extension.
    Async Function PrintDoc(ByVal fileName As String) As Task

        eventHandled = New TaskCompletionSource(Of Boolean)()
        myProcess = New Process
        Using myProcess
            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
                AddHandler myProcess.Exited, New EventHandler(AddressOf myProcess_Exited)
                myProcess.Start()

            Catch ex As Exception
                Console.WriteLine("An error occurred trying to print ""{0}"":" &
                vbCrLf & ex.Message, fileName)
                Return
            End Try

            ' Wait for Exited event, but not more than 30 seconds.
            Await Task.WhenAny(eventHandled.Task, Task.Delay(30000))
        End Using
    End Function

    ' Handle Exited event and display process information.
    Private Sub myProcess_Exited(ByVal sender As Object,
            ByVal e As System.EventArgs)

        Console.WriteLine("Exit time:    {0}" & vbCrLf &
            "Exit code:    {1}" & vbCrLf & "Elapsed time: {2}",
            myProcess.ExitTime, myProcess.ExitCode,
            Math.Round((myProcess.ExitTime - myProcess.StartTime).TotalMilliseconds))
        eventHandled.TrySetResult(True)
    End Sub

    Shared Sub Main(ByVal args As String())

        ' Verify that an argument has been entered.
        If args.Length <= 0 Then
            Console.WriteLine("Enter a file name.")
            Return
        End If

        ' Create the process and print the document.
        Dim myPrintProcess As New PrintProcessClass
        myPrintProcess.PrintDoc(args(0)).Wait()

    End Sub
End Class

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