Поделиться через


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 сохранить системные ресурсы.

Применяется к

См. также раздел