可以在我的应用程序启动时已经运行的进程上使用EnableRaisingEvents吗?

时间:2016-08-09 13:57:57

标签: c# winforms

目前,我有一个程序可以启动另一个应用程序并使用此代码监视该应用程序以使其保持运行:

System.Diagnostics.Process startProgram =
    System.Diagnostics.Process.Start("program.exe", String.Format(Program.ConnectionArg));
startProgram.EnableRaisingEvents = true;
startProgram.SynchronizingObject = this;
startProgram.Exited += this.PrematureClose;

然而,如果我的节目以某种方式被杀,我会担心会发生什么。我的程序重启时是否可以使用EnableRaisingEventsstartProgram.Exited

我有一种感觉,我可能需要抛弃我的代码,转而使用某种定时器循环来检查进程是否仍在运行。

编辑08-10-2016:

所以我尝试了基于Process Monitoring

的以下代码和VS.

它告诉我的是什么:

  

无法隐式转换类型System.Diagnostics.Process []'到' System.Diagnostics.Process'

System.Diagnostics.Process program_open_check = 
    System.Diagnostics.Process.GetProcessesByName("program");
program_open_check.EnableRaisingEvents = true;
program_open_check.SynchronizingObject = this;

1 个答案:

答案 0 :(得分:0)

实际上解决了这个问题,却忘记了发布。

因此,最大的问题是,由于处理对象被用作using块的一部分,因此处理对象被处置了。下面的代码是执行此操作的可靠方法。另外,您可以直接定义一个函数,而不使用委托。

        Process[] processes_array = Process.GetProcessesByName("someprogram");
        foreach (Process some_process in processes_array)
        {
            some_process.EnableRaisingEvents = true;
            some_process.Exited += delegate (object sender, EventArgs args)
            {
                // Do work.
                // DISPOSE PROCESS IF NOT USING IT AFTER THIS!!
            };
        }