我有一组消耗 CPU 的执行,每个执行都在低优先级的线程中运行。这些线程将在一个进程(如 IIS)中运行,该进程有许多其他线程,我不想减慢它们的速度。我想计算所有其他线程的 cpu 使用率,如果它大于 50%,那么我会暂停其中一个线程,如果它小于 50%,我会恢复暂停的执行。
在暂停时,我将执行状态保存在数据库中并终止其线程,在恢复时,我启动新线程。
我需要的是一个返回线程的 cpu 使用百分比的函数。
private static void monitorRuns(object state)
{
Process p = Process.GetCurrentProcess;
double usage = 0;
foreach(ProcessThread t in p.Threads)
{
if(!myThreadIds.Contains(t.Id)) // I have saved my own Thread Ids
{
usage += getUsingPercentage(t); // I need a method like getUsingPercentage
}
}
if(usage > 50){
pauseFirst(); // saves the state of first executions and terminates its threads
}else{
resumeFirst(); // start new thread that executes running using a state
}
}
使用计时器调用此函数:
Timer t = new Timer(monitorRuns,null,new TimeSpan(0,0,10),new TimeSpan(0,5,0));
要计算进程/线程的 CPU 使用率,您应该获取系统/进程/线程的特定时间范围的处理器时间。然后您可以计算 CPU 使用率,不要忘记将该值除以 CPU 核心数。
ProcessWideThreadCpuUsage = (ThreadTimeDelta / CpuTimeDelta)
SystemWideThreadCpuUsage = (ThreadTimeDate / CpuTimeDelta) * ProcessCpuUsage
- 要获取进程的处理器时间:.
- 要获取线程的处理器时间:ProcessThread.TotalProcessorTime API http://msdn.microsoft.com/en-us/library/system.diagnostics.processthread.totalprocessortime%28v=vs.110%29.aspx
I found 这个例子 http://www.codeproject.com/Articles/10258/How-to-get-CPU-usage-of-processes-and-threads解释了该方法。您可以阅读它作为参考。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)