45

我想找到一种方法来遍历所有活动进程并对它们进行诊断检查(内存使用情况、cpu 时间等),有点类似于任务管理器。

问题分为两部分:

  1. 查找所有进程
  2. 查找有关它们的诊断属性

我什至不确定要在哪个名称空间中查找它。任何帮助/提示/链接都将不胜感激。

4

7 回答 7

91

查找所有进程

您可以通过 Process 类执行此操作

using System.Diagnostics;
...
var allProcesses = Process.GetProcesses();

运行诊断

你能在这里给我们更多的信息吗?目前还不清楚你想做什么。

Process 类提供了一些信息,尽管这可能会对您有所帮助。可以查询这个类

  • 所有线程
  • 主窗口句柄
  • 所有加载的模块
  • 有关内存的各种诊断信息(分页、虚拟、工作集等......)
  • 基本进程信息(id、名称、磁盘位置)

编辑

OP 提到他们想要获取内存和 CPU 信息。这些属性在 Process 类中很容易获得(由 GetProcesses() 返回)。下面是列出所有受支持属性的 MSDN 页面。有多种内存和 CPU 可供选择,以满足您的需求。

http://msdn.microsoft.com/en-us/library/system.diagnostics.process.aspx

代码:

将此行添加到您的使用列表中:

using System.Diagnostics;

现在您可以使用 Process.GetProcesses() 方法获取进程列表,如下例所示:

Process[] processlist = Process.GetProcesses();

foreach (Process theprocess in processlist)
{
    Console.WriteLine("Process: {0} ID: {1}", theprocess.ProcessName, theprocess.Id);
}
于 2009-03-15T19:47:11.350 回答
12

查找所有进程实际上相当容易:

using System.Diagnostics;

Process[] processes = Process.GetProcesses();

foreach (Process process in processes)
{
    // Get whatever attribute for process.
}
于 2009-03-15T19:56:24.497 回答
10

JaredPar 已经指出了Process该类,所以我将补充一点,您应该知道,该类会在创建实例时获取进程信息的快照。这不是实时取景。要更新它,您必须调用Refresh()实例。

还要记住,当您检查它时,该进程可能会关闭,因此请准备好捕获异常并相应地处理它们。

最后,如果您致电Process.GetProcesses(),您还将获得伪进程“空闲”和“系统”。IIRC 它们具有特定的进程 ID,因此您可以轻松地将它们过滤掉。

于 2009-03-15T19:59:30.773 回答
2

这是我更喜欢访问进程的方式:

static void Main(string[] args)
{
    Process.GetProcesses().ToList().ForEach(p =>
    {
        Console.WriteLine(
            p.ProcessName + " p.Threads.Count=" + p.Threads.Count + " Id=" + p.Id);
    });

    Console.ReadKey();
}
于 2018-09-22T20:11:24.393 回答
0

您使用什么操作系统?我从你的 C# 标签中得到它是 windows 吗?

如果是这样,请查看 WMI,尤其是 Win32_Process 类。这是 MSDN 参考: http: //msdn.microsoft.com/en-us/library/aa394372 (VS.85).aspx

以及这里的几个使用场景(例如获取进程列表):http: //msdn.microsoft.com/en-us/library/aa394599 (VS.85).aspx

于 2009-03-15T19:48:53.030 回答
0

那么你可以在powershell中做到这一点

1.查找所有进程

get-Process 

2.查找有关它们的诊断属性

get-Process | where-object { $_.Handles -gt 200 }

上面的代码将返回超过 200 个句柄的所有进程,您可以通过这种方式轻松指定诊断属性。

有关如何使用 powershell 处理进程的更多信息,请参阅此

于 2009-03-15T21:30:55.297 回答
0
using System.Diagnostics;

class Program
{
   static void Main()
   {   
      Process[] processlist = Process.GetProcesses();`          
   }
}

这里的进程数组包含所有存在于其中的进程数。

于 2015-09-22T12:41:22.280 回答