2008-10-15 24 views
1

.NET框架中是否有任何類可用於在時間趕上指定的DateTime對象時引發事件?檢查指定日期何時發生的最佳方法

如果沒有,檢查時有哪些最佳實踐?創建一個新的線程不斷檢查?一個計時器(天堂禁止;))?

回答

4

我不會用線程方法。雖然睡眠線程不消耗用戶CPU時間,但它確實使用內核/系統CPU時間。其次,在.NET中,您無法調整線程的堆棧大小。所以,即使它只是在睡眠,你仍然堅持2MB的命中(我相信這是一個新線程的默認堆棧大小)。

使用System.Threading.Timer。它使用高效的計時器隊列。它可以擁有數百個輕量級定時器,並且只能在所有定時器之間重用的1個線程上執行(假定大多數定時器不同時觸發)。

0

當線程休眠時,它不消耗CPU使用。一個非常簡單的方法是讓一個線程休眠到DateTime。例如,

DateTime future = DateTime.Now.Add(TimeSpan.FromSeconds(30)); 
     new Thread(() => 
     { 
      Thread.Sleep(future - DateTime.Now); 
      //RaiseEvent(); 
     }).Start(); 

這基本上說,將來會有一個日期(從現在起三十秒)。然後創建一個線程,睡眠時間的差異。然後舉起你的活動。

編輯:添加一些關於定時器的更多信息。定時器沒有問題,但我認爲這可能是更多的工作。你可以有一個間隔時間差的計時器。這會在時間趕上日期時間對象時觸發滴答事件。 另一種我不會推薦的方法,我似乎認爲你有這個,但每五秒鐘就會有一個計時器,並檢查時間是否匹配。我會避免這種做法,並堅持讓線程睡覺,直到有工作要做。

+0

當您的應用程序被告知退出時(如果退出發生在時間發生之前),會長時間睡眠的線程會幹乾淨淨地死掉嗎? – 2008-10-16 01:50:44

+0

使用ManualResetEvent可以模擬當您希望退出應用程序時非常敏感的睡眠模式。 myEvent.WaitOne(未來 - Datetime.now) ... 然後從你的主線程,當你想退出,只是myEvent.Set ... 如果線程超時,你有你的時間..如果它被解僱,你正在退出 – 2009-06-18 23:07:05

0

計時器可能並不是一個壞的方法。只需使用DateTime.Now來檢測它是否超過了目標時間。不要使用==,除非您嘗試將時間歸一化爲分鐘或小時等。

相關問題