2013-01-08 59 views
1

如何获得我的应用程序的运行线程的cpuload。
我的应用程序运行在linux,mac not windows。c#单线程获取线程的CPU使用情况

我更新单声道版本3.0.2。
现在我能得到的“Process.GetCurrentProcess().Threads”正确的线程数,但没有ProcessThread对象是提供给阅读“TotalProcessorTime

我能做些什么来计算CPU使用率我运行的应用程序/线程?

我可以得到正在运行的线程的linux-process-id吗?如果可以,我可以读取proc目录结构,但我找不到任何方法。

我希望有人能帮助我。

回答

2

显然,Process.Threads属性仅partially implemented at the moment

// This'll return a correctly-sized array of empty ProcessThreads for now. 
int error; 
return new ProcessThreadCollection(new ProcessThread[GetProcessData (pid, 0, out error)]); 

不知道什么麻烦你为我碰上得到的进程ID,此代码seems to work

using System; 
using System.Diagnostics; 
using System.IO; 

class MainClass 
{ 
    static void Main(string[] args) 
    { 
     int pid = Process.GetCurrentProcess().Id; 
     DirectoryInfo taskDir = new DirectoryInfo(String.Format("/proc/{0}/task", pid)); 
     foreach(DirectoryInfo threadDir in taskDir.GetDirectories()) 
     { 
      int tid = Int32.Parse(threadDir.Name); 
      Console.WriteLine(tid); 
     } 
    } 
} 
+0

是的,这是正确的,但我不能引用managed-thread-id到linux-thread-id。 – mjungwirth

+0

[MSDN says](http://msdn.microsoft.com/en-us/library/system.threading.thread%28v=vs.110%29.aspx):“操作系统ThreadId与因为非托管主机可以控制托管线程和非托管线程之间的关系,具体来说,一个复杂的主机可以使用CLR托管API来针对相同的操作系统线程调度多个托管线程,或者在不同的操作之间移动托管线程系统线程“。单声道目前可能不会那样做,但我不会依赖它。 – Jester