如何在当前计算机上获取长时间运行的服务列表?
我可以列出所有进程但是如何添加以过滤长时间运行的进程?
private void ListProcesses()
{
Process[] processCollection = Process.GetProcesses();
foreach (Process p in processCollection)
{
Console.WriteLine(p.ProcessName);
}
}
答案 0 :(得分:2)
Process类有一个datetime属性Process.StartTime,它获取关联进程启动的时间。 您可以使用它来确定哪些运行时间更长。
答案 1 :(得分:1)
我可以列出所有进程但是如何添加以过滤长时间运行的进程?
喜欢(假设你要求的时间):
foreach (var p in processCollection.Where(n => (DateTime.Now - p.StartTime) > someThresholdInterval))
{
//...long running
}
您还可以使用其他属性,例如TotalProcessorTime,这将为您提供该进程实际使用处理器的总时间(与休眠相比),这在某些情况下可能更有趣。
如果你真的想要服务而不是进程,那么有一种不同的方法可以获得这些服务。然而,要使服务使用ServiceController.GetServices,我认为在他们开始时没有办法获得服务。
答案 2 :(得分:1)
仅用于运行服务,我们必须使用ServiceController和ManagementObject。这是我的代码" long"运行服务:
static public void Main()
{
TimeSpan Interval = new TimeSpan(5,0,10); // as exemple
var scServices= ServiceController.GetServices();
foreach (ServiceController scTemp in scServices)
{
if (scTemp.Status == ServiceControllerStatus.Running)
{
ManagementObject wmiService;
wmiService = new ManagementObject("Win32_Service.Name='" + scTemp.ServiceName + "'");
wmiService.Get();
var id = Convert.ToInt32(wmiService.Properties["ProcessId"].Value);
Process p = Process.GetProcessById(id);
if ((DateTime.Now.Subtract(p.StartTime)) > Interval)
{
Console.WriteLine(" Service : {0}", scTemp.ServiceName);
Console.WriteLine(" Display name: {0}", scTemp.DisplayName);
Console.WriteLine(" StartTime: {0}", p.StartTime);
}
}
}
Console.ReadLine();
}