2016-11-22 23 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); 
} 

このコードを実行して1回目のexeを起動すると、2回目の実行は開始されません。しかし、もし私がif (processArray != null && programIsRunning == false)を実行すると、2番目のexeファイルは、最初のファイルが実行されていなくても実行されます。実行中の別のexeファイルに依存してexeファイルを実行する方法

+1

while(true)の代わりにtimer inseadを使用する方がずっと良いです。そうでなければ、プログラムは、そのタスクに利用可能なすべてのリソースを頻繁に使用しているかどうかをチェックします。そしてなぜprocessArray == nullをチェックするのですか?明らかに 'processArray = Process.GetProcessesByName(Path.GetFileNameWithoutExtension(process));'は作成され、サイクル中に次のdoで更新されません。 – Vladimir

+1

Process.GetProcessesByNameは、プロセスが実行されていない場合はnullを返しません。空の配列を返します。 – sgmoore

+1

少なくともデバッガを使用してコードをステップさせて、processArrayの値をチェックするためにデバッガを使用します。 – MethodMan

答えて

4

ここにあなたの最大の問題は、十分なコードがループしているではありません(とそのwhile(true)!)

あなたがfalseにprogramIsRunningをリセットしない(とあなたが本当にしても、その変数を必要としない)ので、または再Process配列を取得すると、最初の結果のみが実行されます(実際にはprocessArrayがnullの場合にのみ実行され、おそらくは空になります)。

あなたが本当にに近い何かをしたい:

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"に変更しなければなりませんでした。 – Adam

+0

@Adamそれはすぐには聞こえません....プロセスがすでに起動している場合は、そのプロセスを開始してください。最後のfalseは* null-coalescing *演算子の後ろにあり、 'processArray'がnullであることはほとんどありません。 – BradleyDotNET

+0

これで問題は解決しましたが、OSの問題のためにファイルを失ってしまいました。今、私はそのコードを '!processArray'というファイルが全く開いていない場合、 'processArray'ファイルが何であっても開きます。 – Adam

関連する問題