Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.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

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

C# 如何创建一个永无止境的线程,不会减慢电脑的速度

C# 如何创建一个永无止境的线程,不会减慢电脑的速度,c#,multithreading,service,C#,Multithreading,Service,我用C开发了一个Windows服务,它在OnStart事件中启动7个线程,这些线程调用一个方法来初始化一些硬件设备,然后在等待来自这些设备的外部事件时进入while循环 每个线程中的while循环是: try { while (!_shutdownEvent.WaitOne(0)) { } } catch { } 问题

我用C开发了一个Windows服务,它在OnStart事件中启动7个线程,这些线程调用一个方法来初始化一些硬件设备,然后在等待来自这些设备的外部事件时进入while循环

每个线程中的while循环是:

            try
            {
                while (!_shutdownEvent.WaitOne(0)) { }
            }
            catch
            {

            }
问题是,当服务启动时,线程正在运行,PC速度非常慢。如何进行这样的循环是最好的方法


线程初始化在while循环之前,线程清理在while循环之后。

在每次迭代之后,您可能会让线程休眠几毫秒

try
 {
  while (!_shutdownEvent.WaitOne(0)) 
   {
     Thread.Sleep(1000);
   }
 }
 catch
 {
 }

在每次迭代之后,您可能会使线程休眠几毫秒

try
 {
  while (!_shutdownEvent.WaitOne(0)) 
   {
     Thread.Sleep(1000);
   }
 }
 catch
 {
 }

您的硬件设备应该在数据到达并调用事件时触发中断,这意味着您不需要在7个不同的线程中循环。相反,一旦您从硬件接收到一些数据,然后启动一个线程来处理该数据,以便主线程可以接收更多数据。这种类型的while循环将冻结一个线程,如果您在带有HT的四核处理器上有7个线程,这意味着您的PC上所有其他程序只剩下一个线程,这会导致速度减慢。

当数据到达并调用事件时,您的硬件设备应触发中断,这意味着您不需要在7个不同的线程中循环。相反,一旦您从硬件接收到一些数据,然后启动一个线程来处理该数据,以便主线程可以接收更多数据。这种类型的while循环将冻结一个线程,如果您在带有HT的四核处理器上有7个线程,这意味着您的PC上所有其他程序只剩下一个线程,这会导致速度减慢。

最好的方法是根本不要循环。显示您正在使用的硬件的API,当您忽略的数据可用时,可能会引发一个事件,这将使您完全摆脱循环。最好的方法是根本不循环。显示您正在使用的硬件的API,当您忽略的数据可用时,可能会引发一个事件,这将使您完全摆脱循环。或者更好_shutdownEvent.WaitOne1000,同样的效果,但是会在WaitOne的超时上暂停。或者更好_shutdownEvent.WaitOne1000,效果相同,但会在WaitOne超时时暂停。