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

Wenn ich diesen Code ausführen und starten Sie die erste exe die zweite startet nicht (es soll). aber wenn ich if (processArray != null && programIsRunning == false) mache, läuft die 2. exe Datei auch wenn die erste nicht läuft.Wie führe ich eine EXE-Datei abhängig von einer anderen exe-Datei ausgeführt

+1

es ist viel besser zu Timer-Insead von while (true) zu verwenden, andernfalls Programm möglicherweise überprüfen, ob Bedingung sehr häufig alle verfügbare Ressource für diese Aufgabe verwenden. Und warum überprüfen Sie processArray == null, eindeutig 'processArray = Process.GetProcessesByName (Path.GetFileNameWithoutExtension (process));' wird nur erstellt werden und würde nicht in der nächsten während des Zyklus aktualisiert werden. – Vladimir

+1

Process.GetProcessesByName gibt NULL nicht zurück, wenn der Prozess nicht ausgeführt wird, sondern ein leeres Array zurückgibt. – sgmoore

+1

Verwenden Sie den Debugger für Starter, um den Wert von processArray zu überprüfen, haben Sie zumindest mit dem Debugger den Code durchgegangen ..? – MethodMan

Antwort

4

Ihr größtes Problem hier ist nicht genug, um Code in der Schleife (und seine while(true)!)

Weil Sie nicht programIsRunning auf false zurückgesetzt haben (und Sie wirklich nicht brauchen, auch diese Variable) oder re -get Ihr Process Array, nur das erste Ergebnis wird jemals laufen (und wirklich, es läuft nur, wenn processArray ist Null, die es wahrscheinlich nicht ist, nur leer).

Sie wirklich wollen, etwas näher an:

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); 

Auch könnte der Code verbessert werden immens von der Schleife in einem separaten Thread setzen und eine Bedingung für die während mit, so dass Sie es richtig herunterfahren, Alternativ verwenden Sie einfach Timer. Sie brauchen auch nicht wirklich eine Schleife, da Sie an das Exited Ereignis des Prozesses anhängen können, den Sie für den Fall, dass es heruntergefahren wird, erstellen.

+0

Ja, das hat funktioniert, aber ich musste "! ProcessArray? .any" zu "processArray? .any" ändern, was bedeutet "false" am Ende? – Adam

+0

@Adam Das klingt nicht richtig ... durch Entfernen der! Sie sagen, wenn der Prozess bereits läuft, starten Sie es. Das Falsche am Ende steht hinter einem * Null-Koaleszenz * -Operator und ist für den unwahrscheinlichen Fall, dass 'ProzessArray' null ist. – BradleyDotNET

+0

Okay, ich habe das Problem behoben, aber jetzt habe ich die Datei aufgrund von Betriebssystemproblemen verloren. Jetzt, wenn ich diesen Code verwende, wenn sein '! ProcessArray' diese Datei überhaupt nicht öffnet, wenn sein 'processArray' die Datei öffnet, egal was – Adam

Verwandte Themen