C# 什么';在后台使用无限循环比使用新线程更好吗?
现在,我正在一个新线程中读取应用程序内存之外的内容,该线程使用infinte循环C# 什么';在后台使用无限循环比使用新线程更好吗?,c#,multithreading,loops,C#,Multithreading,Loops,现在,我正在一个新线程中读取应用程序内存之外的内容,该线程使用infinte循环 public void ReadMemory() { //read memory Thread.Sleep(10); } 不幸的是,即使是1毫秒的睡眠,我也能在1分钟内完成60-100个循环。没有任何睡眠,循环速度为1000-1500/秒,但需要大量CPU。我不敢相信我对此无能为力,所以我在这里问你:P.CPU使用可能是个问题,因为我想在不同的线程(或smth其他线程)中添加更多的后台工作函数 有没有什么东西可以
public void ReadMemory()
{
//read memory
Thread.Sleep(10);
}
不幸的是,即使是1毫秒的睡眠,我也能在1分钟内完成60-100个循环。没有任何睡眠,循环速度为1000-1500/秒,但需要大量CPU。我不敢相信我对此无能为力,所以我在这里问你:P.CPU使用可能是个问题,因为我想在不同的线程(或smth其他线程)中添加更多的后台工作函数
有没有什么东西可以像暂停10毫秒那样减少循环的数量?线程被设计为消耗尽可能多的CPU时间,除非其他线程需要该CPU时间。如果您只是试图释放线程以便CPU可以执行其他任务,请不要这样做。Windows将根据需要自动将马力分配给任何其他线程。线程设计为消耗尽可能多的CPU时间,除非其他线程需要该CPU时间。如果您只是试图释放线程以便CPU可以执行其他任务,请不要这样做。Windows将根据需要自动为任何其他线程分配马力。不要担心CPU的使用。这是一个荒谬的概念 没有“运行一点的代码”或“缓慢运行代码只消耗25%的CPU”之类的东西 在最低级别,它是一个二进制的东西:您的代码要么运行,消耗100%的核心,要么不运行,在这种情况下,它使用0%的CPU 操作系统显示的CPU使用率是运行平均值 因此,您需要问的问题不是“如何在不使用这么多CPU的情况下运行代码”,而是更简单的“我的代码是否在不应该运行的时候运行?”如果您希望您的代码运行,那么它至少会暂时使用100%的CPU,这没有什么问题 现在还不清楚
Sleep()
调用在应用程序中扮演什么角色。
你还在等什么?您是否只希望在每次迭代之间经过几毫秒?或者你在等待某个特定事件的发生
在任何情况下,当您调用Sleep(10)
时,您的线程都不会挂起10毫秒。您正在暂停它至少10毫秒。您正在告诉操作系统现在将线程放入睡眠队列,一旦10毫秒过去,该线程应该被认为有资格再次执行。但这仍然取决于操作系统是否能够安排线程,这可能需要10毫秒(或更长,或更短,取决于各种因素)
在Windows上,Sleep(0)
是一种特殊情况,您可以尝试使用它。它不是实际挂起线程,而是简单地告诉操作系统线程已使用其当前时间片完成,允许其他线程/进程执行,但不会使线程处于睡眠状态:下次发生上下文切换时仍可以安排线程。
因此,如果目标只是确保其他线程/进程有机会运行,那么调用Sleep(0)
可能是一种方法
另一种方法是忽略这个问题,并相信操作系统知道如何安排进程(这是一个非常安全的假设。不要担心这一点,除非你确实看到你的其他后台进程正在挨饿。它们很可能不会)
最后,当然,您可以设置线程和进程优先级,向操作系统提示它应该优先调度哪些线程。如果您给这个线程一个低优先级,它将只在没有更高优先级的线程可用时被调度,以确保您不会耗尽其他线程。不要担心CPU的使用。这是一个荒谬的概念 没有“运行一点的代码”或“缓慢运行代码只消耗25%的CPU”之类的东西 在最低级别,它是一个二进制的东西:您的代码要么运行,消耗100%的核心,要么不运行,在这种情况下,它使用0%的CPU 操作系统显示的CPU使用率是运行平均值 因此,您需要问的问题不是“如何在不使用这么多CPU的情况下运行代码”,而是更简单的“我的代码是否在不应该运行的时候运行?”如果您希望您的代码运行,那么它至少会暂时使用100%的CPU,这没有什么问题 现在还不清楚
Sleep()
调用在应用程序中扮演什么角色。
你还在等什么?您是否只希望在每次迭代之间经过几毫秒?或者你在等待某个特定事件的发生
在任何情况下,当您调用Sleep(10)
时,您的线程都不会挂起10毫秒。您正在暂停它至少10毫秒。您正在告诉操作系统现在将线程放入睡眠队列,一旦10毫秒过去,该线程应该被认为有资格再次执行。但这仍然取决于操作系统是否能够安排线程,这可能需要10毫秒(或更长,或更短,取决于各种因素)
在Windows上,Sleep(0)
是一种特殊情况,您可以尝试使用它。它不是实际挂起线程,而是简单地告诉操作系统线程已使用其当前时间片完成,允许其他线程/进程执行,但不会使线程处于睡眠状态:下次发生上下文切换时仍可以安排线程。
因此,如果目标只是确保其他线程/进程有机会运行,那么调用Sleep(0)
可能是一种方法
另一种方法是忽略这个问题,并相信操作系统知道如何安排进程(这是一个非常安全的假设。不要担心这一点,除非你确实看到你的其他后台进程正在挨饿。它们很可能不会)
最后,当然,您可以设置线程和进程优先级,向操作系统提示它应该优先调度哪些线程。如果你
public class Reader
{
private static int count= 0;
public void ReadMemory()
{
//read memory
// Sleep every 501 iterations
if (Reader.count++ == 500)
{
Thread.Sleep(1);
Reader.count = 0;
}
}
}