2011-01-13 29 views
6

我有使用定時器或使用睡眠兩種可供選擇的是什麼,我需要調用一個方法,這個方法完成每3秒後,我寫了基本的例子來證明我的意思:我應該使用休眠或定時器

public static void Main() 
{ 
    new Thread(new ThreadStart(fooUsingSleep)).Start(); 

    callToMethodAfterInterval(new Action<object, ElapsedEventArgs>(fooUsingTimer), 3000); 
} 

public static void fooUsingSleep() 
{ 
    Console.WriteLine("Doing some consuming time work using sleep"); 
    Thread.Sleep(3000); 
    fooUsingSleep(); 
} 

public static void fooUsingTimer(object dummy, ElapsedEventArgs dummyElapsed) 
{ 
    Console.WriteLine("Doing some consuming time work usning timer"); 
    callToMethodAfterInterval(new Action<object, ElapsedEventArgs>(fooUsingTimer), 3000); 
} 

public static void callToMethodAfterInterval(Action<object,ElapsedEventArgs> inMethod, int inInterval) 
{ 
    System.Timers.Timer myTimer = new System.Timers.Timer(); 
    myTimer.Elapsed += new ElapsedEventHandler(inMethod); 
    myTimer.Interval = inInterval; 
    myTimer.AutoReset = false; 
    myTimer.Start(); 
} 

所以我的問題是

1)我可以用計時器寫更優雅的代碼嗎?意味着從fooUsingTimer中移除對callToMethodAfterInterval方法的調用,使定時器一行或兩行,並從fooUsingTimer的聲明中刪除虛擬變量?

2)我明白睡眠不忙等待(http://www.codeproject.com/KB/threads/ThreadingDotNet.aspx) 所以我沒有發現在這裏使用定時器選項的理由,因爲睡眠更簡單,有什麼更好的使用,定時器版本還是睡眠版本?

3)我知道,Timers.timer是線程安全的,它可以幫助我在我想要實現的行爲?

謝謝。

回答

2

您的計劃的真實環境也很重要。

睡眠選項「廢物」一個主題,而不是在一個小控制檯應用程序,但一般不是一個好主意的問題。

你並不需要重新啓動定時器,以下將繼續滴答聲:

static void Main(string[] args) 
    { 
     var t = new System.Timers.Timer(1000); 
     t.Elapsed += (s, e) => CallMeBack(); 
     t.Start(); 

     Console.ReadLine(); 
    } 
+1

我會注意到,我不認爲這正是原來的意圖所做的 - 這是做長時間運行的任務,然後在完成後3秒再次運行它 - 您的每秒都會運行? – Paddy 2011-01-13 12:31:37

+0

@ Paddy,對,我假設一個相對較短的任務。 OP應該告訴。 – 2011-01-13 13:35:43

0

睡眠會做的伎倆,定時器,另一方面已被設計爲確切的目的,約定是更好的,他們通常會讓你的代碼更容易理解。

+0

我怎麼能寫計時部更優雅? – Delashmate 2011-01-13 11:39:32

3

你是否意識到fooUsingSleep被一遍又一遍地自稱?它最終會產生堆棧溢出。

如果您使用的計時器,它可以這樣簡單:

System.Windows.Forms.Timer t = new System.Windows.Forms.Timer(); 
    t.Interval = 3000; 
    t.Tick += new EventHandler((o,ea) => Console.WriteLine("foo"));