如何在C#(托管代码)中获得* THREAD *的CPU使用率和/或RAM使用率?

我知道如何获得进程的CPU使用率和内存使用率,但我想知道如何在每个线程级别上获取它。 如果最好的解决方案是做一些P-Invoking,那也没关系。

我需要的例子:

Thread myThread = Thread.CurrentThread; // some time later in some other function... Console.WriteLine(GetThreadSpecificCpuUsage(myThread)); 

这是一个做你想做的事的例子http://www.codeproject.com/KB/system/processescpuusage.aspx

如上所述,内存使用无法回答,因为这是整个过程的一个属性,但CPU使用:

 Process p = Process.GetCurrentProcess(); // getting current running process of the app foreach (ProcessThread pt in p.Threads) { // use pt.Id / pt.TotalProcessorTime / pt.UserProcessorTime / pt.PrivilegedProcessorTime } 

您无法获得每个线程的内存使用量,因为内存在进程中的所有线程之间共享。 操作系统如何知道您是否在一个线程中分配了内存并在另一个线程中使用了它。 这意味着什么?

这是一个简单的程序,它启动5个消耗不同CPU数量的线程,然后匹配托管线程消耗的CPU数量。

 using System; using System.Collections.Generic; using System.Diagnostics; using System.Runtime.InteropServices; using System.Threading; class Program { [DllImport("Kernel32", EntryPoint = "GetCurrentThreadId", ExactSpelling = true)] public static extern Int32 GetCurrentWin32ThreadId(); static void Main(string[] args) { Dictionary threads = new Dictionary(); // Launch the threads for (int i = 0; i < 5; i++) { Thread cpuThread = new Thread((start) => { lock (threads) { threads.Add(GetCurrentWin32ThreadId(), Thread.CurrentThread); } ConsumeCPU(20 * (int)start); }); cpuThread.Name = "T" + i; cpuThread.Start(i); } // Every second wake up and see how much CPU each thread is using. Thread monitoringThread = new Thread(() => { Stopwatch watch = new Stopwatch(); watch.Start(); while (true) { Thread.Sleep(1000); Console.Write("\r"); double totalTime = ((double)watch.ElapsedMilliseconds); if (totalTime > 0) { Process p = Process.GetCurrentProcess(); foreach (ProcessThread pt in p.Threads) { Thread managedThread; if (threads.TryGetValue(pt.Id, out managedThread)) { double percent = (pt.TotalProcessorTime.TotalMilliseconds / totalTime); Console.Write("{0}-{1:0.00} ", managedThread.Name, percent); } } } } }); monitoringThread.Start(); } // Helper function that generates a percentage of CPU usage public static void ConsumeCPU(int percentage) { Stopwatch watch = new Stopwatch(); watch.Start(); while (true) { if (watch.ElapsedMilliseconds > percentage) { Thread.Sleep(100 - percentage); watch.Reset(); watch.Start(); } } } } 

请注意,CLR可能会更改托管线程正在执行的本机线程。 但是,在实践中,我不确定这种情况经常发生的频率。