2017-08-30 91 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作爲程序集加載到應用程序中,然後調用該方法... –

相關問題