Process.EnableRaisingEvents Свойство
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Получает или задает значение, указывающее, следует ли вызывать событие Exited при прекращении процесса.
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
Значение свойства
Значениеtrue
, если событие Exited должно быть вызвано при завершении связанного процесса (выход или вызов метода Kill()); в противном случае — значение false
. Значение по умолчанию — false
. Обратите внимание, что даже если значение EnableRaisingEvents равно false
, Exited событие будет вызвано методом HasExited доступа к свойству, если он определяет, что процесс завершился.
- Атрибуты
Примеры
В следующем примере кода создается процесс печати файла. Оно задает EnableRaisingEvents свойство , чтобы вызвать Exited событие процесса при выходе из него. Обработчик Exited событий отображает сведения о процессе.
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
Комментарии
Свойство EnableRaisingEvents указывает, следует ли уведомлять компонент о завершении процесса операционной системой. Свойство EnableRaisingEvents используется в асинхронной обработке для уведомления приложения о завершении процесса. Чтобы заставить приложение синхронно ожидать события выхода (которое прерывает обработку приложения до тех пор, пока не произошло событие выхода), используйте WaitForExit метод .
Примечание
Если вы используете Visual Studio и дважды щелкните Process компонент в проекте, Exited автоматически создаются делегат событий и обработчик событий. Дополнительный код задает свойству EnableRaisingEvents значение false
. Необходимо изменить это свойство на , true
чтобы обработчик событий выполнялся при завершении связанного процесса.
Если значение компонента EnableRaisingEvents равно true
, или , если EnableRaisingEvents имеет значение false
и HasExited компонент вызывает проверка, компонент может получить доступ к административной информации для связанного процесса, которая сохраняется операционной системой. К таким сведениям относятся ExitTime и ExitCode.
После завершения Handle связанного процесса компонент компонента больше не указывает на существующий ресурс процесса. Вместо этого его можно использовать только для доступа к сведениям операционной системы о ресурсе процесса. Операционная система знает, что существуют дескрипторы для завершенных процессов, которые не были освобождены компонентами Process , поэтому она сохраняет ExitTime сведения и Handle в памяти.
Существует плата, связанная с отслеживанием завершения процесса. Если EnableRaisingEvents имеет значение true
, Exited событие возникает при завершении связанного процесса. Процедуры для Exited запуска события в это время.
Иногда приложение запускает процесс, но не требует уведомления о его закрытии. Например, приложение может запустить Блокнот, чтобы позволить пользователю выполнять редактирование текста, но больше не использовать приложение Блокнота. Вы можете не получать уведомления о завершении процесса, так как это не относится к непрерывной работе приложения. При установке EnableRaisingEvents значения можно false
сохранить системные ресурсы.