如何运行一个EXE文件依赖于另一个EXE文件运行

问题描述:

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

这里你最大的问题是没有足够的代码在循环(及其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