2016-11-22 192 views
0
static Process[] processArray = new Process[1]; 
static void Main(string[] args) 
{ 

    bool programIsRunning = false; 
    string process = "file location file name .exe"; 
    processArray = Process.GetProcessesByName(Path.GetFileNameWithoutExtension(process)); 
    Console.WriteLine(processArray); 
    do 
    { 
     if (processArray == null && programIsRunning == false) 
     { 
      Process.Start("file location file name .exe"); 
      programIsRunning = true; 
     } 
    } while (true); 
} 

當我運行這個代碼並啓動第一個EXE第二個不開始運行(它應該)。但是如果我做if (processArray != null && programIsRunning == false)即使第一個exe文件沒有運行,第二個exe文件也會運行。如何運行一個EXE文件依賴於另一個EXE文件運行

+1

它更好地使用timer insead while(true)否則程序可能會檢查條件是否非常頻繁地使用該任務的所有可用資源。爲什麼你檢查processArray == null,顯然'processArray = Process.GetProcessesByName(Path.GetFileNameWithoutExtension(process));'只會被創建,並且在下一個while循環中不會被更新。 – Vladimir

+1

如果進程沒有運行,Process.GetProcessesByName不會返回null,而是返回一個空數組。 – sgmoore

+1

使用調試器爲初學者檢查processArray的值你是否至少使用調試器通過代碼?..? – MethodMan

回答

4

這裏你最大的問題是沒有足夠的代碼在循環(及其while(true)!)

因爲你不重置programIsRunning爲假(你真的甚至不需要這個變量),或再 - 獲取Process數組,只有第一個結果會運行(實際上,它只在processArray爲空時才運行,它可能不是,只是空的)。

你真的想要的東西更接近:通過將在一個單獨的線程你的循環,並具有對在條件這樣你就可以正確地關閉它

string process = "file location file name .exe"; 
do 
{ 
    processArray = Process.GetProcessesByName(Path.GetFileNameWithoutExtension(process)); 
    Console.WriteLine(processArray); 
    if (!processArray?.Any() ?? false) 
    { 
     Process.Start(process); 
    } 
    Thread.Sleep(2000);//IMPORTANT: Sleep or you are doing expensive work in a tight loop! 
} while (true); 

即使該代碼可以改進非常,或者,只需使用Timer即可。您也不需要循環,因爲您可以附加到您創建的進程的事件Exited以防萬一關閉。

+0

是的,但是我必須將「!processArray?.any」更改爲「processArray?.any」,那麼「false」是什麼意思呢? – Adam

+0

@Adam這聽起來不正確....通過刪除!你說如果這個過程已經在運行,那就開始吧。最後的錯誤是在* null-coalescing *運算符的後面,並且對於'processArray'爲空的情況不太可能。 – BradleyDotNET

+0

好吧,我解決了這個問題,但是現在由於某些操作系統問題而丟失了文件。現在當我使用該代碼,如果它的'!processArray'文件根本不打開,如果它的'processArray'文件將打開,不管是什麼 – Adam