.NET将变量设置为正在运行的进程(如果进程正在运行)

时间:2017-08-30 17:51:05

标签: c# .net phantomjs

我在后台运行Phantomjs.exe。 我想让这个过程一直在运行。什么时候使用这个过程(点击按钮)我想检查过程是否正在运行。如果它正在运行,我想使用该过程。如果它没有运行,我将开始一个新的过程。

我已经找到了如何检查进程是否正在运行以及如何在这种情况下启动新进程。但我不知道如何将C#变量与已经运行的进程连接起来? (因此无需启动 - 每次停止过程,这需要花费大量时间)

我的代码:

public bool IsProcessOpen(string name)
{
  foreach (Process clsProcess in Process.GetProcesses())
  {
    if (clsProcess.ProcessName.Contains(name))
    {
      return true;
    }
  }
  return false;
}

private void button1_Click(object sender, EventArgs e)
    {
        PhantomJSOptions options = new PhantomJSOptions();
        PhantomJSDriver driver = null;
        bool phantomOpened = IsProcessOpen("Phantomjs");

      if(!phantomOpened)
     {
        PhantomJSDriver driver = new PhantomJSDriver(options);
      }
      else //set PhantomJSDriver to running exe
     {
     }


}

1 个答案:

答案 0 :(得分:0)

我认为这里存在一些误解:

  • 检查具有给定名称的流程无法确保您检测到正确的流程。我可以将记事本重命名为PhantomJS,你会发现错误的记录。

  • 您无法简单地访问其他进程的内存。每个进程都有自己的虚拟内存,可以防止其他进程。

解决方案是:

  • 用于检测正在运行的进程,使用命名的Mutant(Mutex)。如果找到它,则进程正在运行,如果没有,则启动该进程。给它一个很难被猜到或重复使用的GUID或其他名称。
  • 用于在两个进程之间交换数据使用named pipe or shared memory(一般概念,语言无关)或IPC channel(特定于.NET)

让自己与这些概念失败,你可能会在SO上找到代码示例。

我不建议使用替代解决方案:

  • 如果使用多个桌面,则向其他进程发送Window消息可能无法正常工作。
  • 实现一个附加到进程的调试器......好吧,做一些困难的东西。