现在的位置: 首页 > 综合 > 正文

Process.EnableRaisingEvents 属性

2013年09月12日 ⁄ 综合 ⁄ 共 3005字 ⁄ 字号 评论关闭

Process.EnableRaisingEvents 属性

.NET Framework 4.5
此主题尚未评级 评价此主题

获取或设置在进程终止时是否应激发 Exited 事件。

命名空间:  System.Diagnostics
程序集:  System(在 System.dll 中)

[BrowsableAttribute(false)]
public bool EnableRaisingEvents { get; set; }

属性值

类型:System.Boolean
如果关联的进程终止(通过退出或者调用 Kill)时应引发 Exited 事件,则为 true;否则为 false 默认值为 false 

EnableRaisingEvents 属性指示在操作系统关闭进程时是否通知该组件。 EnableRaisingEvents 属性用于在异步处理中向应用程序通知进程已退出。 若要强制应用程序同步等待退出事件(它一直中断应用程序的处理,直到退出事件发生为止),请使用 WaitForExit 方法。

说明说明

如果正在使用 Visual Studio 并且双击了您的项目中的 Process 组件,则将自动生成 Exited 事件委托和事件处理程序。 附加代码将 EnableRaisingEvents 属性设置为 false 必须将此属性更改为 true,以便在关联进程退出时执行您的事件处理程序。

当关联的进程在被操作系统关闭(通过正常或不正常终止)后退出时,操作系统便通知与该进程关联的每个进程组件(只要该组件的 EnableRaisingEvents 值为 true)。 如果某个组件启动该进程,则该组件可访问关联进程的管理信息,操作系统仍存储这些信息。 此类信息包括 ExitTime 和 ExitCode

关联的进程退出后,组件的 Handle 不再指向现有进程资源。 相反,它仅可用于访问有关进程资源的操作系统信息。 操作系统知道 Process 组件尚未释放已退出进程的若干句柄,所以它在内存中保存 ExitTime 和 Handle 信息。

监视进程的退出是有成本的。 如果 EnableRaisingEvents 为 true,则关联进程终止时将激发 Exited 事件。 此时,您为 Exited 事件指定的过程将运行。

有时,应用程序启动了一个进程,但不需要将进程的关闭通知给应用程序。 例如,应用程序可启动“记事本”,以便用户执行文本编辑,但不必将“记事本”应用程序另作它用。 可以选择在进程退出时不通知,因为该进程与应用程序的继续运行不相关。 将 EnableRaisingEvents 设置为 false 可节省系统资源。

下面的代码示例创建打印文件的进程。 对 EnableRaisingEvents 属性进行设置,以便在该进程退出时使该进程引发 Exited 事件。 Exited 事件处理程序将显示进程信息。

using System;
using System.Diagnostics;
using System.Threading;

class PrintProcessClass
{

    private Process myProcess = new Process();
    private int elapsedTime;
    private bool eventHandled;

    // Print a file with any known extension.
    public void PrintDoc(string fileName)
    {

        elapsedTime = 0;
        eventHandled = false;

        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 \"{0}\":" + "\n" + ex.Message, fileName);
            return;
        }

        // Wait for Exited event, but not more than 30 seconds.
        const int SLEEP_AMOUNT = 100;
        while (!eventHandled)
        {
            elapsedTime += SLEEP_AMOUNT;
            if (elapsedTime > 30000)
            {
                break;
            }
            Thread.Sleep(SLEEP_AMOUNT);
        }
    }

    // Handle Exited event and display process information.
    private void myProcess_Exited(object sender, System.EventArgs e)
    {

        eventHandled = true;
        Console.WriteLine("Exit time:    {0}\r\n" +
            "Exit code:    {1}\r\nElapsed time: {2}", myProcess.ExitTime, myProcess.ExitCode, elapsedTime);
    }

    public static void 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();
        myPrintProcess.PrintDoc(args[0]);
    }
}


.NET Framework

受以下版本支持:4.5、4、3.5、3.0、2.0、1.1、1.0

.NET Framework Client Profile

受以下版本支持:4、3.5 SP1

  • LinkDemand 

    用于完全信任直接调用方。 此成员不能由部分信任的代码使用。

Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008(不支持服务器核心角色), Windows Server 2008 R2(支持带 SP1 或更高版本的服务器核心角色;不支持 Itanium)

.NET Framework 并不是对每个平台的所有版本都提供支持。有关支持的版本的列表,请参见.NET Framework 系统要求

抱歉!评论已关闭.