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 - Fatal编程技术网

C#多线程:微线程休眠的开销

C#多线程:微线程休眠的开销,c#,multithreading,C#,Multithreading,我有一个应用程序可以抓取另一个桌面的快照。此进程在单独的backgroundworker线程中异步放置和运行。DoWork事件的小型模型是: private void GrabImage_DoWork(object sender, DoWorkEventArgs e) { /*Grab the image..*/ System.Threading.Thread.Sleep(10) } 目前有一个thread.sleep(10),我只是想知道这样一个小的睡眠是否会因为不断增加不必要的上下文切

我有一个应用程序可以抓取另一个桌面的快照。此进程在单独的backgroundworker线程中异步放置和运行。DoWork事件的小型模型是:

private void GrabImage_DoWork(object sender, DoWorkEventArgs e)
{
 /*Grab the image..*/
 System.Threading.Thread.Sleep(10)
}
目前有一个thread.sleep(10),我只是想知道这样一个小的睡眠是否会因为不断增加不必要的上下文切换而导致性能下降

如果问题需要进一步解释,请告诉我。 干杯

编辑: 决定加入更多的上下文来帮助关注一个具体的答案

提出的问题 问:这是当前运行的唯一后台线程吗? 答:没有。实际上有几个backgroundworker线程,还有一个线程使用.NET Threadpool类将多个线程排队。因此,最初将睡眠放在代码中是为了允许对这些其他线程进行上下文切换。 然而,我相信无论如何操作系统都是时间分割的,所以我确信在没有睡眠的情况下,其他线程将有机会执行

问:这个后台工作人员是否一直在运行? 答:应用程序提供了一个界面,通过切换按钮与桌面交互,以显示背景图像。 因此,如果按下按钮,backgroundworker基本上可以关闭或持续搅拌


我希望总体问题不会对性能不重要。我试图在性能和可用性之间找到一个很好的平衡。

这是绝对可能的,但这一切都取决于执行此代码的上下文。回答您的问题的最佳方法是分析应用程序,看看这段代码是否会造成瓶颈。

这是绝对可能的,但这完全取决于执行这段代码的上下文。回答您的问题的最佳方法是分析应用程序,查看此代码是否会造成瓶颈。

使用睡眠:

  • 可能会增加CPU总时间(因为进入睡眠和醒来所需的开销)
  • 将增加任务的挂钟时间(因为即使在不必要的时候也要睡觉)
另一种选择是使用低优先级线程而不是休眠线程。

使用休眠:

  • 可能会增加CPU总时间(因为进入睡眠和醒来所需的开销)
  • 将增加任务的挂钟时间(因为即使在不必要的时候也要睡觉)

另一种选择可能是使用低优先级线程而不是休眠。

休眠可能会导致额外的上下文切换,因为它将允许其他线程在进程内执行

但是,听起来您只有一个后台工作线程。如果是这样的话,你可能无论如何都会得到上下文切换。每当后台工作人员报告进度时(因为他们正在跨线程调用),也会发生这种情况。有了一个,我怀疑您是否会注意到所涉及的性能问题,尽管唯一确定的方法是分析您的应用程序

我更大的问题是:你为什么要在这里加上睡眠,特别是如果你担心的是什么。通常,您会在这里专门添加一个sleep-in来允许其他线程工作,这通常会导致上下文切换。如果你是故意这么做的,那就不用担心了。另一方面,如果你不需要这种睡眠,就没有理由包括它


编辑:以下是回复您的编辑的一些细节:

问:这是当前运行的唯一后台线程吗?答:没有。实际上有几个backgroundworker线程,还有一个线程使用.NET Threadpool类将多个线程排队。因此,最初将睡眠放在代码中是为了允许对这些其他线程进行上下文切换。然而,我相信无论如何操作系统都是时间分割的,所以我确信在没有睡眠的情况下,其他线程将有机会执行

操作系统将进行时间切片,但(默认情况下)此线程将具有默认优先级。理论上,它应该获得与主线程和其他线程运行相同的处理器时间。你不必睡觉,但有时这是有利的(见下文)

问:这个后台工作人员是否一直在运行?答:应用程序提供了一个界面,通过切换按钮与桌面交互,以显示背景图像。因此,如果按下按钮,backgroundworker基本上可以关闭或持续搅拌

如果工作线程将坐在一个循环中,只是不断地消耗CPU,那么添加一些机制来防止它耗尽整个CPU核心通常是有利的(除非您需要该线程的实时性能)。小规模睡眠(尽管睡眠(0)在这方面也很有效)是一个简单的选择。然而,如果算法对此有意义的话,最好将某种类型的WaitHandle放在适当的位置,这样您只需要根据需要工作。这实际上取决于算法

因为我已经在使用Threadpool类,所以我也将此工作负载排队到Threadpool类,而不是单独的backgroundworker


BackgroundWorker类使用ThreadPool线程,因此这样做没有真正的优势。但是,BackgroundWorker使处理UI线程变得更简单,因此,如果您在UI上显示进度,使用BW可能会更容易,就像您现在所做的那样。

睡眠可能会导致额外的上下文切换,因为它将允许其他线程在您的进程中执行

但是,听起来您只有一个后台工作线程。如果是这样的话,你可能无论如何都会得到上下文切换。这往往发生在后台工作人员报告进度的任何时候(