Ich habe ein Modul geschrieben, das alle 250 ms eine Liste der laufenden Prozesse für Windows XP und höher abruft. Ich habe den .Net & WMI Weg ausprobiert, beide sind sehr CPU-intensiv. Beide sind jedoch auf meinem Rechner innerhalb von 80 ms fertig. Die CPU-Auslastung meines Host-Prozesses bleibt in beiden Fällen über 10 bis 14 Prozent. Ich denke, die Eigenschaft Location/ExecutionPath ist der eigentliche Übeltäter. Gibt es einen besseren Weg, um diese Informationen zu erhalten?
Bearbeitung1: In meinem Test - Der .Net-Weg war zwar CPU-intensiver, aber etwas schneller als der WMI-Weg. - Der WMI-Weg war langsamer, aber weniger CPU-intensiv, da er die CPU-Auslastung auf den WMI-Provider-Host verschob
private static int WMIOhne()
{
string wmiAbfrage = "SELECT ProcessId, ExecutablePath FROM Win32_Process";
using (var searcher = new ManagementObjectSearcher(wmiQuery))
{
using (var results = searcher.Get())
{
foreach (ManagementObject oReturn in results)
{
if (oReturn["ExecutablePath"] != null)
{
_Processes.Add(new ProcessInfo()
{
ProcessID = (uint)oReturn["ProcessId"],
FilePath = oReturn["ExecutablePath"].ToString(),
});
}
}
return results.Count;
}
}
}
private static int NetWeg()
{
var processListe = System.Diagnostics.Process.GetProcesses();
foreach (System.Diagnostics.Process laufenderProzess in processListe)
{
if (laufenderProzess.Id > 4)
{
try
{
_Processes.Add(new ProcessInfo()
{
ProcessID = (uint)laufenderProzess.Id,
FilePath = laufenderProzess.MainModule.FileName,
});
}
catch { }
}
}
return processListe.Length;
}