2017-08-30 4 views
0

Ich bin Phantomjs.exe im Hintergrund ausgeführt. Ich möchte diesen Prozess die ganze Zeit laufen lassen. Wenn es Zeit ist, diesen Prozess zu verwenden (per Knopfdruck), würde ich gerne prüfen, ob der Prozess läuft. Wenn es läuft, möchte ich diesen Prozess verwenden. Wenn es nicht läuft, werde ich einen neuen Prozess starten..NET Variable auf laufenden Prozess setzen (wenn Prozess läuft)

Ich habe herausgefunden, wie man in diesem Fall prüft, ob der Prozess läuft und wie man einen neuen Prozess startet. Aber ich weiß nicht, wie C# Variable mit bereits laufenden Prozess verbinden? (So ​​gibt es keine Notwendigkeit zu starten - Stoppvorgang jedes Mal, was viel Zeit in Anspruch nimmt)

Mein Code:

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 
    { 
    } 


} 

Antwort

0

Ich denke, es gibt einige Missverständnisse hier:

  • Wenn Sie nach einem Prozess mit einem bestimmten Namen suchen, kann nicht sichergestellt werden, dass Sie den richtigen Prozess erkennen. Ich kann Notepad zu PhantomJS umbenennen und Sie werden die falsche erkennen.

  • Sie können nicht einfach auf den Speicher eines anderen Prozesses zugreifen. Jeder Prozess hat seinen eigenen virtuellen Speicher, der vor anderen Prozessen geschützt ist.

Lösungen sind:

  • für einen laufenden Prozess zu erfassen, einen benannten Mutanten (Mutex) verwenden. Wenn Sie es finden, wird der Prozess ausgeführt, wenn nicht, starten Sie den Prozess. Gib ihm einen GUID oder einen anderen Namen, der kaum erraten oder wiederverwendet werden kann.
  • für Daten zwischen zwei Prozessen verwenden, um einen named pipe or shared memory (allgemeinen Begriffe, sprachunabhängig) oder ein IPC channel (.NET spezifisch)

Machen Sie sich mit diesen Begriffen failiar Austausch und Sie werden wahrscheinlich Code-Beispiele hier auf SO finden .

Alternative Lösungen, die ich nicht empfehlen würde:

  • eine Fensternachricht an den anderen Prozess gesendet arbeiten möglicherweise nicht zuverlässig im Falle werden mehrere Desktops verwendet.
  • Implementieren eines Debuggers, der an den Prozess anfügt und ... nun, machen Sie schwierige Sachen.
+0

Gibt es wirklich keinen anderen (leichteren) Weg? Nehmen wir an, ich erstelle eine einfache EXE mit nur einer Methode und führe sie dann aus. Das einzige, was ich will, ist, diese einfache Methode von einer anderen Anwendung aus aufzurufen. Muss ich dafür wirklich IPC/Named Pipes verwenden? – FrenkyB

+0

@FrenkyB: Wenn es so einfach ist, warum implementieren Sie die Methode nicht direkt in Ihrem Code? Oder laden Sie die EXE als Assembly in Ihre Anwendung und rufen Sie die Methode dort auf ... –