2013-05-27 36 views
1

我有一个应用程序,每个x秒轮询一些设备, 我的实现基于每个设备的一个线程。永不结束主题vs任务

每个线程以这种方式

while(true){ 
    stopWatch.Start(); 
    //dowork 
    stopWatch.Stop(); 
    time = (int)(delay - stopWatch.ElapsedMilliseconds); 
    stopWatch.Reset(); 
    sleep(time); 
} 

现在是正确的做法还是应该实现定时器火灾每×秒,并创建一个新的任务来实现?

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

+1

使用定时器IMO。然而,你不需要创建新的任务,我不会想到。只需在回调方法中编写代码即可。 –

+0

我应该使用N个计时器,其中N =设备的编号 – VeNoMiS

+0

如果工作时间超过延迟时间,您将睡眠消极时间.....计时器对您会更好。 – Mzf

回答

0

使用投票间隔的睡眠似乎是做到这一点的最好办法一个单独的线程。它将轮询睡眠后所需的设备。既然你正在做一个重复的任务,可能永远不会结束,直到程序结束,我不认为使用任务真的适合这种情况,即使它可以被使用。

+0

,但使用一个计时器不平行我的民意调查 – VeNoMiS

+0

你希望你所有的民意调查(可能)在同一时间发生?是否有这个原因? – Flipbed

+0

是,想象它像一个所有设备的istant图片,更多的是如果一个设备无法响应(我正在轮询100设备)我不能等待超时执行下一个 – VeNoMiS

1

使用正在循环的线程对您来说工作较少,并且会产生更清晰的代码。所以我建议你这样做。

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

+0

我不太确定。有了计时器,你可以不需要时间计算代码,你可以说它每触发一次延迟毫秒。 – svick

+0

然后,你还必须处理并发滴答和可靠当组件应该关闭时停止定时器。也许你想在计时器滴答声中保持状态。它可能会稍微复杂一些。当然不太明显的是怎么回事。 – usr