2009-06-22 38 views
0

所以我有一個程序,它有一個定時器列表。每個定時器都有一個滴答事件,我們只是說,例如,我有10個定時器已開始(全部都在列表中)。正確的方式有無盡的等待

什麼是永遠坐下的最佳方式(或者直到我告訴它停止)?我應該只是有一個while循環?

foreach(Timer t in _timers) 
{ 
    t.Start(); 
} 

while(true) 
{ 
    Application.DoEvents(); 
    System.Threading.Thread.Sleep(5000); 
} 

我有一種感覺,這是不是最好的辦法...

- 更新 這裏是我的整個程序:

public static void Main() 
{ 
    // set some properties and set up the timers 

    foreach(Timer t in _timers) 
    { 
     t.Start(); 
    } 

    while(true) 
    { 
     Application.DoEvents(); 
     System.Threading.Thread.Sleep(5000); 
    } 
} 

完蛋了。沒有用戶界面,沒有別的。如果我沒有while循環,那麼程序就結束了。

+0

什麼時候在當前的設計方案結束了嗎?您目前在其中一個定時器後面是否有退出事件? – Rap 2009-06-22 20:30:36

+0

(回覆評論) – 2009-06-22 21:06:42

回答

3

Application.DoEvents,我假設你在這裏的UI線程。保持UI線程活躍並不是一個好主意(即使是DoEvents)。爲什麼不直接啓動定時器並將控制權釋放回消息泵。當事件打勾時,它會提取事件。

爲什麼要循環?


重新更新;您使用的是Timer?如果您使用System.Timers.Timer(與Elapsed事件),那麼它不綁定到消息循環(它觸發一個單獨的線程):你可以掛在主線程,或許等一些退出條件:

using System; 
using System.Timers; 
static class Program { 
    static void Main() { 
     using (Timer timer = new Timer()) { 
      timer.Interval = 2000; 
      timer.Elapsed += delegate { 
       Console.Error.WriteLine("tick"); 
      }; 
      timer.Start(); 
      Console.WriteLine("Press [ret] to exit"); 
      Console.ReadLine(); 
      timer.Stop(); 
     } 
    } 
} 
+0

看到我的答案,我認爲,更好的方法來「掛主線」。 – dss539 2009-06-22 20:43:38

0

您可以等待條件變量,或者在套接字上選擇()。

相關問題