2013-05-27 71 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