C# 暂停线程,直到cpu被释放

C# 暂停线程,直到cpu被释放,c#,.net-core,C#,.net Core,我想要实现的是等待新创建的线程,直到cpu在N%负载下 问题是我无法测量cpu和内存使用情况,因为System.Diagnostics.PerformanceCounter在.NET Core中不起作用 不知道在性能方面暂停线程是否明智 我发现了以下代码: var proc = Process.GetCurrentProcess(); var mem = proc.WorkingSet64; var cpu = proc.TotalProcessorTime; Console.WriteLine

我想要实现的是等待新创建的线程,直到cpu在N%负载下

问题是我无法测量cpu和内存使用情况,因为
System.Diagnostics.PerformanceCounter
在.NET Core中不起作用

不知道在性能方面暂停线程是否明智

我发现了以下代码:

var proc = Process.GetCurrentProcess();
var mem = proc.WorkingSet64;
var cpu = proc.TotalProcessorTime;
Console.WriteLine("My process used working set {0:n3} K of working set and CPU {1:n} msec", mem / 1024.0, cpu.TotalMilliseconds);

foreach (var aProc in Process.GetProcesses())
    Console.WriteLine("Proc {0,30}  CPU {1,-20:n} msec", aProc.ProcessName, cpu.TotalMilliseconds);

但是我不明白如何测量cpu/ram的使用率,以及它如何帮助我得到它在
%/MB

中的使用率对不起,我做不到。嗯,您可以每秒循环检查CPU利用率一次左右,然后等待,但说真的,这是在浪费线程


您可以设置一个低优先级的线程。

很抱歉,无法设置。嗯,您可以每秒循环检查CPU利用率一次左右,然后等待,但说真的,这是在浪费线程

您可以设置一个低优先级的线程。

这是我的常规“速率限制”代码:

请注意,我必须从内存中写入,因此我的语法可能已关闭。

以下是我的正常“速率限制”代码:


请注意,我必须从内存中写入,因此语法可能已关闭。

听起来像是x-y问题。为什么要暂停线程?操作系统将适当安排。@DanielA.White抱歉忘记提及,但编辑了我的问题。我想暂停的线程是新创建的线程。我想暂停它,因为它有助于完成一些工作,但这项工作不需要完成,因此只有在cpu/ram未加载时才能完成,以不影响性能您可以设置线程优先级..听起来像是x-y问题。为什么要暂停线程?操作系统将适当安排。@DanielA.White抱歉忘记提及,但编辑了我的问题。我想暂停的线程是新创建的线程。我想暂停它,因为它有助于完成一些工作,但这项工作不需要完成,因此只有在cpu/ram未加载时才能完成,以不影响性能。您可以设置线程优先级..谷歌搜索“c#优先线程”,并根据线程数量进行缩放。操作系统将执行调度。谷歌搜索“c#prioritizethread”,并根据线程数量进行扩展。操作系统将执行计划。这似乎是一个非常糟糕的主意。有线程互斥体和信号量被设计来正确处理这类事情。@Enigmativity:这是一个简单的速率限制实现。当然,有很多方法可以改进它。但这对初学者来说是一个好的开始。不,这对初学者来说不是一个好的开始。我也不会说它是一个简单的实现——我会说它很危险。这是一个非常糟糕的主意。所有的程序员——特别是初学者——都应该像避免瘟疫一样避免它。@Enigmativity:这到底是什么“像避免瘟疫一样避免”*?OP已经说他有一个决定性的线索。如果他没有,我会在代码前面提到。对我来说,感知到的问题是:a)用户有一个线程运行无限循环来检查它是否有工作要做b)线程并不总是有工作要做。c) 一个无限循环将通过轮询耗尽一个内核。这就是我的代码所针对的问题。我对“没有工作要做”的定义是“没有足够的时间”,但是如果你需要帮助改变一个if,我不知道你为什么要麻烦多任务处理。这似乎是一个非常糟糕的主意。有线程互斥体和信号量被设计来正确处理这类事情。@Enigmativity:这是一个简单的速率限制实现。当然,有很多方法可以改进它。但这对初学者来说是一个好的开始。不,这对初学者来说不是一个好的开始。我也不会说它是一个简单的实现——我会说它很危险。这是一个非常糟糕的主意。所有的程序员——特别是初学者——都应该像避免瘟疫一样避免它。@Enigmativity:这到底是什么“像避免瘟疫一样避免”*?OP已经说他有一个决定性的线索。如果他没有,我会在代码前面提到。对我来说,感知到的问题是:a)用户有一个线程运行无限循环来检查它是否有工作要做b)线程并不总是有工作要做。c) 一个无限循环将通过轮询耗尽一个内核。这就是我的代码所针对的问题。我对“没有工作要做”的定义是“没有足够的时间”,但如果你需要帮助改变一个if,我不知道你为什么要麻烦多任务处理。
bool continue = true;
int rate = 1;
dateTime dueTime = dateTime.Now.AddMilliSeconds(rate);

while(continue){
  if(dateTime.Now >= dueTime){
    //do your thing.
    dueTime = DateTime.Now.AddMilliSeconds(rate);
  }
  else { 
    Thread.Sleep(1); 
  }
}