2009-08-18 31 views

回答

46

使用System.Threading.Timer類:

var dt = ... // next 8:00 AM from now 
var timer = new Timer(callback, null, dt - DateTime.Now, TimeSpan.FromHours(24)); 

callback代表將在下一次是上午8:00,此後每24小時被調用。

請參閱this SO question如何計算接下來的上午8:00發生。

+4

我知道下面的鏈接提到它,但可能想澄清,這是System.Threading.Timer而不是System.Windows.Forms.Timer – McAden 2009-08-18 23:33:28

+1

,如果我從現在開始提供最後8.00將它的工作?那麼給出一個負數? – Jaanus 2013-03-20 20:31:29

+0

@Jaanus不,我只是試了一下,它引發了一個異常。如果dt 2013-05-23 16:21:38

0
private void Run_Timer() 
    { 
     DateTime tday = new DateTime(); 
     tday = DateTime.Today; 
     TimeSpan Start_Time = new TimeSpan(8,15,0); 
     DateTime Starter = tday + Start_Time; 
     Start_Time = new TimeSpan(20, 15, 0); 
     DateTime Ender = tday + Start_Time; 
     for (int i = 0; i <= 23; i++) 
     { 
      Start_Time = new TimeSpan(i, 15, 0); 
      tday += Start_Time; 
      if (((tday - DateTime.Now).TotalMilliseconds > 0) && (tday >= Starter) && (tday <= Ender)) 
      { 
       Time_To_Look = tday; 
       timer1.Interval = Convert.ToInt32((tday - DateTime.Now).TotalMilliseconds); 
       timer1.Start(); 
       MessageBox.Show(Time_To_Look.ToString()); 
       break; 
      } 
     } 
    } 

我們可以利用這個功能獲得定時器運行時間或將其更改爲在特定時間運行:d

+0

很明顯,@ dtb解決方案更好。 – albertein 2009-12-10 23:17:51

+2

但它也很明顯,你沒有得到這樣的想法,一個人問這個問題更好地理解他的問題。我同意他給了我一個在一天中的某個特定時間這樣做的格式,但我必須讓它運行在一些一旦在我的代碼中完成的大部分工作都是爲了運行該循環並設置下一個計時器停止的時間,那麼在一天中的某個時間不是靜態的條件。如果您看到的不是那個行中的行數 – Mobin 2010-03-20 21:25:51

1

確實有你的程序來生成警報?另一種方法是使用Scheduled Task (in Windows)來生成警報。您可能需要寫一個小程序,它從主應用程序的數據文件等收集的任何信息

但使用這種方法的幾個主要好處:

  1. 你沒有寫任何代碼來支持該功能。您可以利用操作系統中內置的某些內容。該示例適用於Windows,但其他操作系統具有相同的功能。您可以將您的開發和支持工作集中在您自己的代碼上。
  2. 您的主應用程序不一定要運行才能觸發任務。
9

詳細闡述dtb的答案,這是我如何實現它。

private void Form1_Load(object sender, EventArgs e) 
    { 
     System.Threading.TimerCallback callback = new TimerCallback(ProcessTimerEvent); 

     //first occurrence at 
     var dt = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 10, 0, 0); 

     if (DateTime.Now < dt) 
     { 
      var timer = new System.Threading.Timer(callback, null, 
               //other occurrences every 24 hours 
          dt - DateTime.Now, TimeSpan.FromHours(24)); 
     } 

    } 

    private void ProcessTimerEvent(object obj) 
    { 
     MessageBox.Show("Hi Its Time"); 
    } 
相關問題