次の方法で共有


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

プロパティ値

正常終了または Kill() の呼び出しによって関連付けられたプロセスが終了したときに Exited イベントを発生させる場合は true。それ以外の場合は 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 イベント デリゲートとイベント ハンドラーが自動的に生成されます。 追加のコードでは、 プロパティを EnableRaisingEventsfalse設定します。 関連付けられたプロセスが終了したときにイベント ハンドラーを実行するには、このプロパティ true を に変更する必要があります。

コンポーネントのEnableRaisingEvents値が の場合、または EnableRaisingEventstrueのときにfalseHasExited 、コンポーネントによってチェックが呼び出されると、コンポーネントは関連付けられたプロセスの管理情報にアクセスでき、オペレーティング システムによって保存されたままになります。 このような情報には、 ExitTime と が ExitCode含まれます。

関連付けられたプロセスが終了した後、コンポーネントの は Handle 既存のプロセス リソースを指し示さなくなります。 代わりに、プロセス リソースに関するオペレーティング システムの情報へのアクセスにのみ使用できます。 オペレーティング システムは、終了したプロセスに対するハンドルがコンポーネントによってProcess解放されていないことを認識しているため、 と Handle の情報はExitTimeメモリ内に保持されます。

プロセスが終了するのを監視することに関連するコストがあります。 が のtrue場合EnableRaisingEventsExited関連付けられたプロセスが終了するとイベントが発生します。 イベントのプロシージャは、 Exited その時点で実行されます。

場合によっては、アプリケーションでプロセスが開始されますが、その終了の通知は必要ありません。 たとえば、アプリケーションでメモ帳を起動すると、ユーザーはテキスト編集を実行できますが、メモ帳アプリケーションをこれ以上使用することはできません。 アプリケーションの継続的な操作には関係ないため、プロセスが終了したときに通知を回避することを選択できます。 を にfalse設定EnableRaisingEventsすると、システム リソースを保存できます。

適用対象

こちらもご覧ください