System.Diagnostics.Process
Wie kann ich feststellen, ob gerade ein Prozess ausgeführt wird, wenn ich einen Verweis auf a erhalte ?
155
Dies ist eine Möglichkeit, dies mit dem Namen zu tun:
Process[] pname = Process.GetProcessesByName("notepad");
if (pname.Length == 0)
MessageBox.Show("nothing");
else
MessageBox.Show("run");
Sie können alle Prozesse in einer Schleife ausführen, um die ID für eine spätere Bearbeitung zu erhalten:
Process[] processlist = Process.GetProcesses();
foreach(Process theprocess in processlist){
Console.WriteLine("Process: {0} ID: {1}", theprocess.ProcessName, theprocess.Id);
}
if/else
, die nur eine Zeile lang sind, müssen keine geschweiften Klammern haben, um die Blockanweisung anzugeben. Dies gilt auch fürforeach
undfor
Aussagen. Es läuft auf den Codierungsstil hinaus.for
Informationen nicht gesehen . Jahre von c # .net dev und ich haben diesen Stil noch nie gesehen. Wie sie sagen: "Du lernst jeden Tag etwas Neues". Vielen Dank für den Beitrag und die Antwort ..Dies ist der einfachste Weg, den ich nach der Verwendung eines Reflektors gefunden habe. Ich habe dafür eine Erweiterungsmethode erstellt:
Die
Process.GetProcessById(processId)
Methode ruft dieProcessManager.IsProcessRunning(processId)
Methode auf undArgumentException
löst aus, falls der Prozess nicht existiert. Aus irgendeinem Grund ist dieProcessManager
Klasse intern ...quelle
Synchrone Lösung:
Asynchrone Lösung:
quelle
reshefm hatte eine ziemlich nette Antwort; Es berücksichtigt jedoch keine Situation, in der der Prozess nie begonnen hat.
Hier ist eine modifizierte Version von dem, was er gepostet hat.
Ich habe seine ArgumentNullException entfernt, da es sich tatsächlich um eine Nullreferenzausnahme handelt und sie trotzdem vom System ausgelöst wird. Außerdem habe ich die Situation berücksichtigt, in der der Prozess nie gestartet wurde oder die Methode close () zum Schließen der verwendet wurde Prozess.
quelle
Dies sollte ein Einzeiler sein:
quelle
Dies hängt davon ab, wie zuverlässig diese Funktion sein soll. Wenn Sie wissen möchten, ob die von Ihnen verwendete Prozessinstanz noch ausgeführt wird und mit 100% iger Genauigkeit verfügbar ist, haben Sie kein Glück. Der Grund dafür ist, dass es vom verwalteten Prozessobjekt aus nur zwei Möglichkeiten gibt, den Prozess zu identifizieren.
Die erste ist die Prozess-ID. Leider sind Prozess-IDs nicht eindeutig und können recycelt werden. Wenn Sie die Prozessliste nach einer passenden ID durchsuchen, werden Sie nur darüber informiert, dass ein Prozess mit derselben ID ausgeführt wird, dies ist jedoch nicht unbedingt Ihr Prozess.
Der zweite Punkt ist der Prozessgriff. Es hat jedoch das gleiche Problem wie die ID und es ist schwieriger, damit zu arbeiten.
Wenn Sie eine mittlere Zuverlässigkeit suchen, ist es ausreichend, die aktuelle Prozessliste auf einen Prozess mit derselben ID zu überprüfen.
quelle
Process.GetProcesses()
ist der Weg zu gehen. Je nachdem, wie er ausgeführt wird, müssen Sie möglicherweise ein oder mehrere unterschiedliche Kriterien verwenden, um Ihren Prozess zu finden (dh als Dienst oder normale App, unabhängig davon, ob er über eine Titelleiste verfügt oder nicht).quelle
Vielleicht (wahrscheinlich) lese ich die Frage falsch, aber suchen Sie nach der HasExited-Eigenschaft, die Ihnen mitteilt, dass der von Ihrem Process-Objekt dargestellte Prozess beendet wurde (entweder normal oder nicht).
Wenn der Prozess, auf den Sie verweisen, eine Benutzeroberfläche hat, können Sie mithilfe der Eigenschaft "Antworten" bestimmen, ob die Benutzeroberfläche derzeit auf Benutzereingaben reagiert oder nicht.
Sie können auch EnableRaisingEvents festlegen und das Ereignis Exited (das asychron gesendet wird) behandeln oder WaitForExit () aufrufen, wenn Sie blockieren möchten.
quelle
Sie können eine Prozessinstanz einmal für den gewünschten Prozess instanziieren und den Prozess mit diesem .NET-Prozessobjekt weiter verfolgen (es wird so lange verfolgt, bis Sie Close für dieses .NET-Objekt explizit aufrufen, selbst wenn der Prozess, den es verfolgt hat, abgestorben ist [Dies soll Ihnen Zeit geben, den Prozess zu beenden, auch bekannt als ExitTime usw.])
Zitieren von http://msdn.microsoft.com/en-us/library/fb4aw7b8.aspx :
quelle
Ich habe die Lösung von Coincoin ausprobiert:
Bevor ich eine Datei verarbeite, kopiere ich sie als temporäre Datei und öffne sie.
Wenn ich fertig bin, schließe ich die Anwendung, wenn sie noch geöffnet ist, und lösche die temporäre Datei:
Ich verwende einfach eine Prozessvariable und überprüfe sie anschließend:
Später schließe ich die Anwendung:
Es funktioniert (soweit)
quelle
openApplication.HasExited()
ist HasExited keine Funktion. Der richtige Weg wäreopenApplication.HasExited
.Trotz der unterstützten API von .Net-Frameworks zur Überprüfung des vorhandenen Prozesses anhand der Prozess-ID sind diese Funktionen sehr langsam. Die Ausführung von Process.GetProcesses () oder Process.GetProcessById / Name () kostet sehr viele CPU-Zyklen.
Eine viel schnellere Methode zum Überprüfen eines laufenden Prozesses anhand der ID ist die Verwendung der nativen API OpenProcess () . Wenn das Rückgabehandle 0 ist, ist der Prozess nicht vorhanden. Wenn sich das Handle von 0 unterscheidet, wird der Prozess ausgeführt. Es gibt keine Garantie dafür, dass diese Methode aufgrund der Erlaubnis jederzeit zu 100% funktioniert.
quelle
Damit sind viele Probleme verbunden, wie andere anscheinend teilweise angesprochen haben:
Unabhängig davon, ob die von anderen genannten Eigenschaften intern sind oder nicht, können Sie Informationen durch Reflexion erhalten, wenn die Erlaubnis dies zulässt.
Sie können Win32-Code für Snapshot aufrufen oder WMI verwenden, das langsamer ist.
Eine andere Option wäre OpenProcess / CloseProcess, aber Sie werden immer noch auf dieselben Probleme stoßen, mit Ausnahmen, die wie zuvor ausgelöst werden.
Für WMI - OnNewEvent.Properties ["?"]:
quelle
Sie können auch einen Timer verwenden, um den Vorgang jedes Mal zu überprüfen
quelle
length == 0
sollte angezeigt werdenNot Working
), erledigt aber trotzdem die Arbeit.