affiX Geschrieben 14. Dezember 2009 Geschrieben 14. Dezember 2009 Hi an alle Leser, Ich habe momentan das folgende Problem: Ich möchste alle Child Prozesse eines Parent Prozesses beenden. Oder einfach gesagt einen Prozessbaum terminieren. Jedoch muss die Lösung dieses Problems ohne Windows APIs realisiert werden! Ich sollte am besten nur das .Net Framework verwenden!!! Momentan habe ich mich mit der System.Diagnostics.Process Klasse beschäftigt, jedoch noch keine Lösung erzielt. Würde mich über eine Antwort zu diesem Thema freuen. mfg affix Zitieren
Bubble Geschrieben 14. Dezember 2009 Geschrieben 14. Dezember 2009 Wenn Du einzelne eigene Prozesse beenden möchtest, dann baue in sie einen Mechanismus ein, mit dem Du dies an sie kommunizieren kannst. Zitieren
VaNaTiC Geschrieben 14. Dezember 2009 Geschrieben 14. Dezember 2009 (bearbeitet) So wie ich das aus der MSDN gesehen hab, fehlt Dir in der Klasse Process der Hinweis auf a) den Parent-Prozess oder die Child-Prozesse. Diese Info bräuchtest Du aber zwingend um den Teilbaum von hinten zu durchlaufen. Hier wird das leider auch nur über Win32-API gemacht: http://www.mobzystems.com/code/killprocesstree.aspx Bearbeitet 14. Dezember 2009 von VaNaTiC Zitieren
0815FIA Geschrieben 15. Dezember 2009 Geschrieben 15. Dezember 2009 Schau dir mal die PerformanceCounter Klasse an, damit kannst du die Parent ID jedes Prozesses herausfinden. Hier stehen noch einige nützliche Infos: System.Diagnostics.Process FAQ Zitieren
.NETter Geschrieben 15. Dezember 2009 Geschrieben 15. Dezember 2009 Hallo, Dir steht im .Net Framework auch der Namensraum System.ServiceProcess zur Verfügung. Hier könntest Du einen ServiceController nutzen welcher Dir abhängige Dienste und Dienste von denen dieser Prozess abhängt anzeigt. Ich habe im Code mal eine sehr simples Beispiel anhand eines TreeView erstellt. Dies ist wie gesagt nur ein Beispiel und legt keinen Wert auf Codequlität! private void Form1_Load(object sender, EventArgs e) { ServiceController[] controllers = ServiceController.GetServices("Dein Rechnername"); foreach (ServiceController sc in controllers) { TreeNode tn = new TreeNode(sc.DisplayName); TreeNode parent = new TreeNode("Parents"); foreach (ServiceController p in sc.ServicesDependedOn) { parent.Nodes.Add(p.DisplayName); } tn.Nodes.Add(parent); TreeNode child = new TreeNode("Childs"); foreach (ServiceController c in sc.DependentServices) { child.Nodes.Add(c.DisplayName); } tn.Nodes.Add(child); treeViewProzesse.Nodes.Add(tn); } } Die TreeView wird mit allen "Dienste" gefüllt. In den Unterordnern werden Childs und Parents angezeigt. Wenn Du hier etwas Fleiß reinsteckst wirst Du bald eine Möglichkeit finden diesen Tree nach Abhängigkeiten zu sortieren und damit dein Problem zu lösen. Viele Grüße, Thomas Zitieren
affiX Geschrieben 15. Dezember 2009 Autor Geschrieben 15. Dezember 2009 Vielen Dank für eure Hilfe! Jedoch muss ich jetzt noch mal eine Frage zu deinem Beispiel stellen. Mit Hilfe des ServiceController erhalte ich doch nur Windows Dienste! Ich benötige aber alle Prozesse bzw. alle Childs zu einem bestimmten Prozess X, welche im Windows Taskmanager aufgelistet werden. Ich werde mich jetzt mit euren Beispielen beschäftigen und anschließend ein Feedback schreiben. cu Zitieren
Bubble Geschrieben 15. Dezember 2009 Geschrieben 15. Dezember 2009 Zu welchem Zweck Du das tun willst, hast Du noch nicht gesagt. Möglicherweise gibt es für das eigentliche Problem ja eine deutlich elegantere Lösung, denn Prozesse einfach zu beenden ist keine besonders gute Variante. Zitieren
.NETter Geschrieben 16. Dezember 2009 Geschrieben 16. Dezember 2009 Hallo, ja genau. hier werden nur Windowsdienste angegeben. Ich schließe mich der vorherigen frage nach der Art der Anwendung an. Einen Prozess zu terminieren sollte nicht die Regel sein sondern eher eine Notlösung. Beim Beenden eines Prozesses über den Taskmanager erhält man ja schon eine Warnung welche auf Systeminstabilität hinweist. Also was willst Du mit diesem Vorgang bezwecken? Windowsdienste zu starten, anzuhalten oder zu beenden ist manchmal ganz nützlich, aber wirklich alle Prozesse? Und warum kein Win32? Gruß, Thomas Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.