Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么';在后台使用无限循环比使用新线程更好吗?_C#_Multithreading_Loops - Fatal编程技术网

C# 什么';在后台使用无限循环比使用新线程更好吗?

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其他线程)中添加更多的后台工作函数 有没有什么东西可以

现在,我正在一个新线程中读取应用程序内存之外的内容,该线程使用infinte循环

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;
        }
    }
}