Wie Prozess beenden in C#, wissen, das mit dem Namen?
Ich habe ein programm läuft, dass eine andere (nennen wir die erste app, die Stater und der zweiten app - Arbeiter).
Benutze ich
process.start();
process.waiForExit();
process.Close();
in der Starter.
Aber wenn der Starter ist gezwungen zu schließen, während der Wartezeit für Arbeiter (für einige extern Grund -) Arbeiter werden immer noch in den Prozessen, blockieren, Dateien, Essen, Speicher, usw.
So, ich möchte, um zu überprüfen, ob Arbeitnehmer, die bereits laufen, bevor ich werde versuchen, es zu starten.
Ich habe versucht Prozess.GetProcessesByName("worker.exe") aber kein Glück (auch wenn ich sehen kann, Arbeitnehmer, die im Task-Manager).
Ich habe gesehen, wie einige Themen hier über prüfen jedes Prozesses im Speicher für die Module, aber immer noch, ich weiß schon, das die Ausführung der Datei-ich hoffe, um zu vermeiden, dass solche Lösung.
Irgendwelche Tipps?
Tut
Starter
tatsächlich beginnen Worker
? Wenn dem so ist, wissen Sie alle Prozess-IDs (durch Process.Id
) der Arbeiter. Sie können (viel zuverlässiger) behandeln von ID.nicht der Prozess, durch den Namen. Was passiert, wenn eine weitere nicht-Anwendung auch startet einen Prozess namens worker.exe?
Und mal ehrlich, @Christian.K, mit einem Namen wie
Worker
ist, wird es traurig und einsam. Ich bedaure es schon.Setzen Sie Ihren Prozess in einem using-block verwenden, so dass, wenn der starter-Prozess nicht normal beendet, es werden noch entsorgen den Arbeitsprozess zu befreien, alle Ressourcen verbrauchen.
InformationsquelleAutor Pavel Oganesyan | 2012-03-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Start an den Arbeitsprozess, speichern Sie dessen ID in der Applikation Konfiguration/Einstellung-Datei, in dieser Weise, wenn Sie starten Sie Ihr Starter-Prozess, wird es zuerst laden, die ID aus einer settings-Datei und überprüfen Sie, wenn dieser Prozess gerade läuft oder nicht. Wenn Sie wollen, sofort zu schließen, Arbeitsprozess, können Sie rufen Sie
process.Kill()
.Ja, wie überprüfen Sie, dass Prozess' name ist Arbeitnehmer zu.
Ja, dachte ich auch drüber nach, vielen Dank!
InformationsquelleAutor Coder
Der Grund, warum Sie nicht finden können, es ist, weil Sie in Benutzung sind .exe. Wenn die ausführbare Datei zeigt, wie worker.exe im TaskManager, einfach anrufen:
Kein problem. Froh, dass du dein problem gelöst. Wenn Sie die Prozess-ID, stellen Sie sicher, dass Sie überprüfen, ob der Prozessname ist "worker.exe". Dies wird verhindern, dass Sie vom töten anderer Prozess, nahm die id, die Sie zuletzt gespeichert
InformationsquelleAutor Tung
Dies ist viel einfacher...
Dieser code, schließen Sie den Editor (falls es ausgeführt wird). Geben Sie den Namen des Programms, das Sie schließen möchten-mit der Erweiterung (.exe-Datei).
Einige Anwendungen nicht beendet werden können, ohne Sie zu zwingen.
Verwenden
/F
nachtaskkill
zu zwingen, die Aktion.Wenn Sie möchten, schließen Sie die Prozess-Struktur
/T
nach Programm-Namen.InformationsquelleAutor Roshana Pitigala
Beim Aufruf GetProcessesByName("Arbeiter") Sie nicht angeben, welche exe-Erweiterung wie bereits erläutert, in MSDN
Und wenn Sie möchten, halten eine Globale variable mit dem Prozess-Objekt, das Sie begonnen haben, Sie könnte verwenden Sie einfach die Prozess.Kill();
InformationsquelleAutor Steve
Wenn Sie nur brauchen, um erkennen, dass "Arbeiter" ausgeführt wird, eine technisch deutlich überlegene Lösung ist es sperren einer globalen mutex für die Dauer seiner Lebenszeit. Jeder Prozess, der weiß, dass der mutex-name (das ist unter deiner Kontrolle) können dann sehen, ob der mutex gesperrt ist (wenn es ist, Arbeiter ausgeführt wird).
Dies ist jedoch nicht leicht zu realisieren, richtig da gibt es viele kleine details, die Sie wollen, um zu bekommen genau das richtige; selbst dann, könnte es eine race condition "starter" und "Arbeitnehmer" sind eigentlich gleichzeitig gestartet usw (natürlich dieses problem, und viele andere, auch für alle anderen Lösungen also nicht als ein Nachteil).
InformationsquelleAutor Jon