C# 永无止境的线程与任务

C# 永无止境的线程与任务,c#,.net,multithreading,task-parallel-library,C#,.net,Multithreading,Task Parallel Library,我有一个每x秒轮询一些设备的应用程序, 我的实现基于每个设备一个线程 每个线程都是以这种方式实现的 while(true){ stopWatch.Start(); //dowork stopWatch.Stop(); time = (int)(delay - stopWatch.ElapsedMilliseconds); stopWatch.Reset(); sleep(time); } 现在这是正确的方法,还是我应该实现一个计时器,每x秒触发一

我有一个每x秒轮询一些设备的应用程序, 我的实现基于每个设备一个线程

每个线程都是以这种方式实现的

while(true){
    stopWatch.Start();
    //dowork
    stopWatch.Stop();
    time = (int)(delay - stopWatch.ElapsedMilliseconds);
    stopWatch.Reset();
    sleep(time);
}
现在这是正确的方法,还是我应该实现一个计时器,每x秒触发一次,然后创建一个新任务


PS:每个设备都有is轮询代码

,使用一个线程在轮询之间休眠似乎是最好的方法。它将在睡眠后轮询所需的设备。因为你正在做一个重复的任务,这个任务可能在程序结束之前永远不会结束,所以我认为使用一个任务并不适合这种情况,即使它可以被使用。

使用一个在两次轮询之间休眠的线程似乎是最好的方法。它将在睡眠后轮询所需的设备。由于您正在执行一个重复的任务,该任务可能在程序结束之前永远不会结束,因此我认为使用任务并不适合这种情况,即使它可以被使用。

使用循环线程对您来说工作量更小,代码更清晰。所以我建议你就这么做


如果您有许多线程或需要节省资源,请使用计时器或异步睡眠(
Task.Delay
+
async/await
)。

使用循环线程对您来说工作量较小,代码更清晰。所以我建议你就这么做



如果你有很多线程或者需要节省资源,可以使用计时器或者异步睡眠(
Task.Delay
+
async/await
)。

使用计时器,我想,你不需要创建新任务。只需在回调方法中编写代码。我应该使用N个计时器,其中N=设备数量如果工作时间超过延迟,则睡眠时间为负。。。。。计时器对你更合适。如果轮询时间太长,程序可能会暂停。对于一个重复的任务,使用N个计时器似乎是不必要的。@Mzf我知道它已被签入到代码中使用计时器,IMO。不过,我想你不需要创建新任务。只需在回调方法中编写代码。我应该使用N个计时器,其中N=设备数量如果工作时间超过延迟,则睡眠时间为负。。。。。计时器对你更合适。如果轮询时间太长,程序可能会暂停。同时,对一个重复任务使用N个计时器似乎是不必要的。@Mzf我知道它已签入代码,但使用单个计时器不会与我的轮询并行您希望(可能)所有轮询都在同一时间发生吗?这是有原因的吗?是的,把它想象成所有设备的istant图片,更多的是,如果一个设备没有响应(我轮询了100个设备),我不能等待超时来执行下一个。哦,好的,我建议你尝试保持线程倒计时,可能有更短的超时。如果您有100个线程,更新速度可能比25个线程(每个线程上有4个设备)慢。但是使用单个计时器无法并行我的轮询您希望(可能)所有轮询都在同一时间发生吗?这是有原因的吗?是的,把它想象成所有设备的istant图片,更多的是,如果一个设备没有响应(我轮询了100个设备),我不能等待超时来执行下一个。哦,好的,我建议你尝试保持线程倒计时,可能有更短的超时。如果你有100个线程,更新速度可能会比25个线程慢,每个线程上有4个设备。我不太确定。有了计时器,你就不需要时间计算代码了,你可以说它每隔
延迟
毫秒触发一次。然后你还必须处理并发的滴答声,并在组件应该关闭时可靠地停止计时器。也许你想在计时器计时之间保持状态。它可能会变得稍微复杂一些。当然不太清楚发生了什么事,我不太确定。有了计时器,你就不需要时间计算代码了,你可以说它每隔
延迟
毫秒触发一次。然后你还必须处理并发的滴答声,并在组件应该关闭时可靠地停止计时器。也许你想在计时器计时之间保持状态。它可能会变得稍微复杂一些。当然不太清楚发生了什么。