Process.EnableRaisingEvents Propriedade
Definição
Importante
Algumas informações dizem respeito a um produto pré-lançado que pode ser substancialmente modificado antes de ser lançado. A Microsoft não faz garantias, de forma expressa ou implícita, em relação à informação aqui apresentada.
Obtém ou define se o Exited evento deve ser ativado quando o processo termina.
public:
property bool EnableRaisingEvents { bool get(); void set(bool value); };
public bool EnableRaisingEvents { get; set; }
[System.ComponentModel.Browsable(false)]
public bool EnableRaisingEvents { get; set; }
member this.EnableRaisingEvents : bool with get, set
[<System.ComponentModel.Browsable(false)>]
member this.EnableRaisingEvents : bool with get, set
Public Property EnableRaisingEvents As Boolean
Valor de Propriedade
true se o Exited evento deve ser levantado quando o processo associado é terminado (seja por uma saída ou por uma chamada para Kill()); caso contrário, false. A predefinição é false. Note-se que mesmo que o valor de EnableRaisingEvents seja , o false evento será elevado pelo Exited acessório da propriedade, se determinar que o HasExitedprocesso terminou.
- Atributos
Exemplos
O seguinte exemplo de código cria um processo que imprime um ficheiro. Define a EnableRaisingEvents propriedade para fazer com que o processo levante o Exited evento quando este sai. O Exited gestor de eventos apresenta informações de processos.
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]);
}
}
open System
open System.Diagnostics
open System.Threading.Tasks
let mutable myProcess = new Process()
let mutable eventHandled = TaskCompletionSource<bool>()
// Handle Exited event and display process information.
let myProcess_Exited (sender: obj) (e: EventArgs) =
printfn $"Exit time : {myProcess.ExitTime}\n"
printfn $"Exit code : {myProcess.ExitCode}\n"
printfn $"Elapsed time : {round ((myProcess.ExitTime - myProcess.StartTime).TotalMilliseconds)}"
eventHandled.TrySetResult true |> ignore
// Print a file with any known extension.
let printDoc fileName =
task {
eventHandled <- TaskCompletionSource<bool>()
use 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.AddHandler(EventHandler myProcess_Exited)
myProcess.Start() |> ignore
with ex ->
printfn $"An error occurred trying to print \"{fileName}\":\n{ex.Message}"
// Wait for Exited event, but not more than 30 seconds.
let! _ = Task.WhenAny(eventHandled.Task, Task.Delay(30000))
()
}
[<EntryPoint>]
let main args =
// Verify that an argument has been entered.
if args.Length <= 0 then
printfn "Enter a file name."
else
// Create the process and print the document.
printDoc(args[0]).Wait() |> ignore
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
Observações
A EnableRaisingEvents propriedade sugere se o componente deve ser notificado quando o sistema operativo desligou um processo. A EnableRaisingEvents propriedade é usada no processamento assíncrono para notificar a sua aplicação de que um processo saiu. Para forçar a sua aplicação a esperar síncronicamente por um evento de saída (que interrompe o processamento da aplicação até que o evento de saída ocorra), use o WaitForExit método.
Note
Se estiver a usar Visual Studio e clicar duas vezes num componente Process no seu projeto, um delegado de evento Exited e um gestor de eventos são automaticamente gerados. Código adicional define a EnableRaisingEvents propriedade como false. Deve alterar esta propriedade para true que o seu gestor de eventos seja executado quando o processo associado sair.
Se o valor do EnableRaisingEvents componente for true, ou quando EnableRaisingEvents for false e uma HasExited verificação for invocada pelo componente, o componente pode aceder à informação administrativa do processo associado, que permanece armazenada pelo sistema operativo. Essa informação inclui o ExitTime e o ExitCode.
Depois de o processo associado sair, o Handle do componente deixa de apontar para um recurso de processo existente. Em vez disso, só pode ser usado para aceder à informação do sistema operativo sobre o recurso do processo. O sistema operativo está ciente de que existem handles para processos saídos que não foram libertados pelos Process componentes, por isso mantém a ExitTime informação e Handle na memória.
Há um custo associado a vigiar a saída de um processo. Se EnableRaisingEvents for true, o Exited evento é levantado quando o processo associado termina. Os seus procedimentos para o Exited evento decorrem nessa altura.
Por vezes, a sua candidatura inicia um processo mas não requer notificação do seu encerramento. Por exemplo, a sua aplicação pode iniciar o Bloco de Notas para permitir que o utilizador realize edição de texto, mas não faça mais uso da aplicação do Bloco de Notas. Pode optar por evitar a notificação quando o processo sai porque isso não é relevante para a operação contínua da sua candidatura. Definir EnableRaisingEvents para false pode poupar recursos do sistema.