获取线程Cpu使用情况

mrd*_*abd 2 c# multithreading cpu-usage

我有一组消耗CPU的执行,每个执行都在低优先级的线程中运行。这些线程将在进程(如IIS)中运行,该进程具有许多其他不想让它们变慢的线程。我想计算所有其他线程的cpu使用率,如果它的使用率大于50%,则我暂停一个线程,如果它的使用率小于50%,我将恢复暂停的执行。

在暂停时,我将执行状态保存在db中并终止其线程,并在恢复时启动新线程。

我需要的是一个返回线程的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
  }
}
Run Code Online (Sandbox Code Playgroud)

此函数通过计时器调用:

Timer t = new Timer(monitorRuns,null,new TimeSpan(0,0,10),new TimeSpan(0,5,0));
Run Code Online (Sandbox Code Playgroud)

sta*_*005 5

要计算进程/线程的CPU使用率,您应该获取系统/进程/线程特定时间范围内的处理器时间。然后,您可以计算CPU使用率,并且不要忘记将该值除以CPU内核数。

ProcessWideThreadCpuUsage = (ThreadTimeDelta / CpuTimeDelta)
SystemWideThreadCpuUsage = (ThreadTimeDate / CpuTimeDelta) * ProcessCpuUsage
Run Code Online (Sandbox Code Playgroud)

我发现该示例说明了该方法。您可以阅读它作为参考。