2017-08-30 66 views
0

我在后台运行Phantomjs.exe。 我想保持这个过程始终运行。当需要使用这个过程时(点击按钮),我想检查过程是否正在运行。如果它正在运行,我想使用该过程。如果它没有运行,我会开始一个新的过程。.NET设置变量以运行进程(如果进程正在运行)

我已经发现如何检查进程是否正在运行以及如何在这种情况下启动新进程。但我不知道如何连接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 
    { 
    } 


} 

回答

0

我觉得有一些误解的位置:

  • 检查具有给定名称的进程不能确保您检测到正确的进程。我可以将记事本重命名为PhantomJS,然后您会发现错误的记事本。

  • 您不能简单地访问另一个进程的内存。每个进程都有自己的虚拟内存,它受到其他进程的保护。

解是:

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

让自己与那些概念failiar,你可能会发现代码示例这里SO 。

替代解决方案我不建议:

  • 发送窗口消息发送到其他进程可能不会在情况下可靠地工作,多台台式机使用。
  • 实现一个调试器,附加到过程中......并且做一些困难的事情。
+0

难道真的没有其他(更简单)的方法吗?比方说,如果我只用一种方法创建一个简单的exe,然后运行它。我想要的只是从另一个应用程序中调用这个简单的方法。我真的必须为此使用IPC /命名管道吗? – FrenkyB

+0

@FrenkyB:如果那么简单,为什么不直接在代码中实现该方法?或者将EXE作为程序集加载到应用程序中,然后调用该方法... –