2012-03-30 154 views
0

我有一個定時器,它會在它自己的線程中無限期地開始工作,直到在主線程中發生某些事情來禁用它,在這種情況下將啓用不同的定時器。這工作完美。唯一的問題是我想完全確定第二個定時器不會運行太久。C#System.Timers.Timer自動關閉?

如果由於某些故障而沒有收到特定的關機命令,例如10分鐘後,是否有辦法讓計時器自動禁用?

我看到該類有InitializeLifetimeService方法。這聽起來像可以幫助,但我不知道如何工作。

感謝球員和加爾斯:)

回答

1

當您啓動第二個給定的時間後,可以禁用它你可以考慮開始第三定時器。

 Timer t1 = new Timer(1000); // fire every second 
     Timer t2 = new Timer(60000); // fire after 10 minutes 
     t2.Elapsed += (o, e) => t1.Stop(); // disable timer 1 when timer 2 is elapsed 

     t1.Start(); 
     t2.Start(); 

上面的例子的方式利用System.Timers.Timer的。如果您正在使用System.Threading.Timer你可以考慮開關那裏,以及對令人驚訝的是System.Timers.Timer是一個誰是天生,其中System.Threading.Timer不是線程安全的。

相當不錯的概述可以在這裏找到: http://msdn.microsoft.com/en-us/magazine/cc164015.aspx

編輯清晰:

t2.Elapsed += (e, o) => t1.Stop(); 

也可以寫成

t2.Elapsed += new ElapsedEventHandler(t2_Elapsed); 

其次

void t2_Elapsed(object sender, ElapsedEventArgs e) 
{ 
    t1.Stop(); 
} 

這是您在Visual Studio中按Ctrl +空格時實際獲得的內容,因爲您可以在較低方法中訪問t1。

+0

你能咀嚼第3行的語法嗎?我不確定我瞭解它是如何工作的。 – 2012-03-30 09:05:11

+0

我在上面插入了一個解釋... - 註釋中的代碼有點乏味...... – ChriPf 2012-03-30 09:18:13

1

你爲什麼不讓它把+1到一個全局變量每次迭代(比方說,如果蜱每秒),使計時器檢查變量每一個刻度,一旦VAR達到600,告訴計時器禁用它自己。

1

只需聲明一個Class變量並在啓動計時器到DateTime.Now時進行設置。然後,包括這在你的計時器:

DateTime time = DateTime.Now; 

    private void timer1_Tick(object sender, EventArgs e) 
    { 
     if (DateTime.Compare(DateTime.Now, time.AddMinutes(10)) > 0) 
     { 
      timer1.Stop(); 
     } 

     // timer code 
    } 
1

分配一個經過事件處理程序和全球布爾

 Private Boolean eOccured = False; 

    System.Timers.Timer aTimer = new System.Timers.Timer(); 
    aTimer.Elapsed+=new ElapsedEventHandler(OnTimedEvent); 
    aTimer.Interval = 600000; //milliseconds(10 min) 
    aTimer.Enabled = True; 

... 代碼激活BOOL如果成功 ...

然後停在事件觸發的計時器。

private static void OnTimedEvent(object source, ElapsedEventArgs e) 
    { 
     If (eOccured) 
     { 
      aTimer.Stop(); 
     } 
    }