Process.EnableRaisingEvents Egenskap
Definition
Viktigt
En del information gäller för förhandsversionen av en produkt och kan komma att ändras avsevärt innan produkten blir allmänt tillgänglig. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, avseende informationen som visas här.
Hämtar eller anger om händelsen Exited ska aktiveras när processen avslutas.
public:
property bool EnableRaisingEvents { bool get(); void set(bool value); };
[System.ComponentModel.Browsable(false)]
public bool EnableRaisingEvents { get; set; }
[<System.ComponentModel.Browsable(false)>]
member this.EnableRaisingEvents : bool with get, set
Public Property EnableRaisingEvents As Boolean
Egenskapsvärde
trueom händelsen Exited ska aktiveras när den associerade processen avslutas (antingen genom ett avslut eller ett anrop till Kill()), annars . false Standardvärdet är false. Observera att även om värdet EnableRaisingEvents för är falseExited genereras händelsen av egenskapsåtkomstorn HasExited om den fastställer att processen har avslutats.
- Attribut
Exempel
I följande kodexempel skapas en process som skriver ut en fil. Den ställer in egenskapen EnableRaisingEvents så att processen genererar händelsen när den Exited avslutas. Händelsehanteraren Exited visar processinformation.
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
Kommentarer
Egenskapen EnableRaisingEvents anger om komponenten ska meddelas när operativsystemet har stängt av en process. Egenskapen EnableRaisingEvents används i asynkron bearbetning för att meddela ditt program att en process har avslutats. Använd metoden för att tvinga programmet att synkront vänta på en avslutningshändelse (som avbryter bearbetningen av programmet tills avslutshändelsen WaitForExit har inträffat).
Note
Om du använder Visual Studio och dubbelklickar på en Process komponent i projektet genereras automatiskt en Exited händelsedelegat och händelsehanterare. Ytterligare kod anger EnableRaisingEvents egenskapen till false. Du måste ändra den här egenskapen till true för att händelsehanteraren ska kunna köras när den associerade processen avslutas.
Om komponentens EnableRaisingEvents värde är true, eller när EnableRaisingEvents är false och en HasExited kontroll anropas av komponenten, kan komponenten komma åt den administrativa informationen för den associerade processen, som fortfarande lagras av operativsystemet. Sådan information omfattar ExitTime och ExitCode.
När den associerade processen har avslutats pekar komponenten Handle inte längre på en befintlig processresurs. I stället kan den bara användas för att komma åt operativsystemets information om processresursen. Operativsystemet är medvetet om att det finns referenser till avslutade processer som inte har släppts av Process komponenter, så det behåller ExitTime informationen och Handle i minnet.
Det finns en kostnad som är kopplad till att titta efter en process att avsluta. Om EnableRaisingEvents är trueutlöses Exited händelsen när den associerade processen avslutas. Dina procedurer för Exited händelsen körs då.
Ibland startar ditt program en process men kräver inte avisering om stängningen. Ditt program kan till exempel starta Anteckningar så att användaren kan utföra textredigering men inte längre använda Anteckningar-programmet. Du kan välja att undvika meddelanden när processen avslutas eftersom den inte är relevant för den fortsatta driften av ditt program. Om du anger EnableRaisingEvents till false kan du spara systemresurser.