Process.Exited Evento
Definizione
Importante
Alcune informazioni sono relative alla release non definitiva del prodotto, che potrebbe subire modifiche significative prima della release definitiva. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
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à .