英語で読む

次の方法で共有


Process.EnableRaisingEvents プロパティ

定義

プロセスが終了したときに、Exited イベントを発生させるかどうかを取得または設定します。

public bool EnableRaisingEvents { get; set; }
[System.ComponentModel.Browsable(false)]
public bool EnableRaisingEvents { get; set; }

プロパティ値

正常終了または 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]);
    }
}

注釈

プロパティは EnableRaisingEvents 、オペレーティング システムがプロセスをシャットダウンしたときにコンポーネントに通知する必要があるかどうかを示します。 プロパティは EnableRaisingEvents 、非同期処理で使用され、プロセスが終了したことをアプリケーションに通知します。 アプリケーションが終了イベント (終了イベントが発生するまでアプリケーションの処理を中断する) を同期的に待機させるには、 メソッドを WaitForExit 使用します。

注意

Visual Studio を使用していて、プロジェクト内のコンポーネントを Process ダブルクリックすると、 Exited イベント デリゲートとイベント ハンドラーが自動的に生成されます。 追加のコードでは、 プロパティを EnableRaisingEventsfalse設定します。 関連付けられたプロセスが終了したときにイベント ハンドラーを実行するには、このプロパティ true を に変更する必要があります。

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

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

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

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

適用対象

製品 バージョン
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1

こちらもご覧ください