2010-08-13 48 views
7

我有一個服務,每10秒點擊一個數據庫,並獲取數據,如果有的話。處理這些數據最多可能需要30秒。如果我使用間隔10秒的定時器,服務將獲得兩次相同的數據。C#計時器與線程服務

的影響我正嘗試實現(只是用於可視化):

while(true) 
{ 
    if(Getnrofrows() > 0) 
     do stuff 
    else 
     sleep for 10 sec 
} 

PPL說了Thread.Sleep是生產性服務業是一個壞主意,我怎麼做這個用的計時器?

/麥克

+4

他們是否也在說*爲什麼* Thread.Sleep是一個壞主意? – Heinzi 2010-08-13 07:19:07

回答

10

你有沒有嘗試定時器屬性自動復位設置爲false,並重新啓用定時器時刷新數據的過程結束

using System; 

public class PortChat 
{ 
    public static System.Timers.Timer _timer; 
    public static void Main() 
    { 

     _timer = new System.Timers.Timer(); 
     _timer.AutoReset = false; 
     _timer.Interval = 100; 
     _timer.Elapsed += new System.Timers.ElapsedEventHandler(_timer_Elapsed); 
     _timer.Enabled = true; 
     Console.ReadKey(); 
    } 

    static void _timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
    { 
     //Do database refresh 
     _timer.Enabled = true; 
    } 
} 
+0

正是我在找的東西。謝謝! – 2010-08-13 08:53:48

+0

對不起,但不應該是_timer.Enabled = false在過去的事件?爲什麼如果它在主要完成,它又被設置爲真? – Neale 2010-10-12 14:45:23

+0

@Neale,最初的問題是關於暫停循環,直到沒有完成。當我們把_timer.Autoreset = false時,在啓用定時器之後循環只會發生一次。因此,當我們的循環結束讀取時,我們將通過啓用它來再次激活定時器 – adopilot 2010-10-12 16:06:37

0

有沒有錯這種方法。睡眠線程不會消耗任何CPU週期。

如果您需要每X秒精確地做一些事情,則需要一個計時器。另一方面,如果您想暫停X秒,那麼Thread.Sleep是適當的。

+0

睡眠線程可能不會消耗任何cpu週期,但與定時器對象相比,它將消耗大量內核資源 – Zuuum 2011-02-21 15:36:25

1

我看不出使用睡眠的任何問題,除非您最終可能會遇到難看的代碼。

要回答你的問題:

public class MyTest 
{ 
    System.Threading.Timer _timer; 


    public MyTest() 
    { 
     _timer = new Timer(WorkMethod, 15000, 15000); 
    } 


    public void WorkMethod() 
    { 
     _timer.Change(Timeout.Infinite, Timeout.Infinite); // suspend timer 

     // do work 

     _timer.Change(15000, 15000); //resume 

    } 
} 
0

Thread.Sleep不壞本身就是一個服務,只是你需要響應服務命令,讓你的工作線程不應該去睡一個小時,而是需要短時間睡眠,然後醒來並聽取服務的服務控制器部分是否由於某種原因而告訴其停止。

你想要這樣做,如果管理員告訴你的服務停止,它將停止足夠快,以便它不會得到任何超時消息,管理員無法確定您的服務已停止,並且重啓機器或類似設備是安全的。