如何跟踪流程

时间:2014-11-07 08:16:08

标签: c# process monitor

问题是如何跟踪我从应用程序开始的流程。

我正在做一个“启动器”,我想跟踪我启动的程序何时关闭。

我检查了这些链接,但我认为这与我正在尝试的完全相同,因为我将启动的流程都是javaw.exe,我需要单独处理它们。

.Net Process monitor

How to detect a process start & end using c# in windows?

这就是代码现在的样子:

{
    Process proc = new Process();
    proc.Exited += EclipseInstanceClosed;
    proc.Disposed += EclipseInstanceDisposed;
    // this property is a *.exe path: 'C:\eclipse\eclipseV4.4.1\eclipse.exe' for example
    proc.StartInfo.FileName = SelectedEclipseInstance.Exec;
    proc.StartInfo.UseShellExecute = true;

    proc.Start();
}

...

void EclipseInstanceClosed(object sender, EventArgs e)
{
    MessageBox.Show("Eclipse was closed!");
}

void EclipseInstanceDisposed(object sender, EventArgs e)
{
    MessageBox.Show("Eclipse was disposed!");
}

但是当我关闭程序时,不会引发这些事件。

有什么想法吗?

更新

我还尝试使用proc.EnableRaisingEvents = true;此解决方案(why Process's Exited method not being called?),但没有成功

更新II:

我修改了代码,以便在Task中启动进程。在这种情况下,事件被提出。是什么原因?

LaunchEclipseProcess();

...

private async void LaunchEclipseProcess()
{
    await Task.Run(() =>
    {
        Process proc = new Process();
        proc.EnableRaisingEvents = true;
        proc.StartInfo.UseShellExecute = true;

        proc.Exited += EclipseInstanceClosed;
        proc.Disposed += EclipseInstanceDisposed;

        proc.StartInfo.FileName = SelectedEclipseInstance.Exec;

        proc.Start();
    });
}

2 个答案:

答案 0 :(得分:0)

你试过吗

  

proc.WaitForExit()

如果您需要其余代码继续执行并在完成后运行EclipseInstanceClosed方法,您甚至可以在另一个线程上运行proc.WaitForExit()。

如果进程实际已停止,则此方法将返回。如果它永远不会返回,则意味着该过程从未停止过。然后你需要解决为什么它不会停止。


在启动应用程序的第一个实例之前,获取所有正在运行的Javaw.exe及其PID的列表。保留此列表。 启动应用程序的新实例后,请重新检查javaw.exe列表。找到新的。为此流程创建一个“参考”,以便像上面编写代码一样对其进行监控。

  

var proc = Process.GetProcessById(id);

继续监控并做你的事情。

如果您启动新流程,请重做上面的逻辑。在之前和之后列出所有javaw.exe以使您的Process.Id进行监控。

如果使用参数运行每个javaw.exe,如果上述方法不够好,还有办法获取这些参数以缩小目标进程的范围。

答案 1 :(得分:0)

proc.Exited += EclipseInstanceClosed;

请注意,上述代码不会在启动的应用程序关闭时通知。 process.Exited事件用于了解关联进程何时完成(通过调用Process.Start()触发的进程)。但是,如果要检查启动的应用程序是否正在运行/关闭,您可以在EclipseInstanceClosed事件中编写一些监视代码,如下所示。

void EclipseInstanceClosed(object sender, EventArgs e)
{
  while (true)
  {
     Process runningEclipseProcess = Process.GetProcessesByName("ExclipeProcessName").FirstOrDefault();

     if (runningEclipseProcess != null)
     {
        //Exclipe is not closed. Wait for 1 sec and check again.
        Thread.Sleep(1000);
     }
     else
     {
        //Exclipe is closed. Notify the user
        MessageBox.Show("Eclipse was closed!");
        break;
    }
  }     
}