2017-02-01 79 views
0

我想有一個定時器,它的間隔考慮回調調用時間。C#定時器考慮回調時間

例如,如果定時器間隔是1000毫秒,回調invokation需要大約500毫秒,然後 T0 = 0,T1 = 1500,T2 = 3000

顯然我不想存儲invokation時間(或它的平均)在一個領域,我希望它能夠儘可能完美地工作。

我有點解決它,但它看起來很糟糕。

System.Timers.Timer timer = new System.Timers.Timer(1000); 
timer.Elapsed += (sender, args) => 
{ 
    timer.Stop(); 
    Console.WriteLine(args.SignalTime); 
    Thread.Sleep(500); //instead!!!, there is something with Db and logistics.. no really a thread sleep 

    timer.Start(); 
}; 

timer.Start(); 

它是唯一的解決方案還是在C#中有任何內置功能?

+1

這看起來完全等同於''Sleep'(1000)'運行'Thread',最後。 – Sinatr

+0

請忽略線程在調用中的睡眠。 Thread.sleep isnt釋放線程池中的線程,同時定時器處理線程。 –

+0

我認爲@Sinatr的意思是,你想要的是相當於運行該方法,然後在單獨的線程中睡1秒一個循環。你不需要計時器。 –

回答

2

您可以使用System.Threading.Timer 1000的duetime參數和無限期限:

using System.Threading; 

Timer timer = new Timer(callback, null, 1000, Timeout.Infinite); 

然後,在你結束回調方法,調用timer.Change(1000, Timeout.Infinite),這將導致您的回調後,它被稱爲1000毫秒已完成,無論您的回調需要執行多長時間。

+0

所以它基本上是相同的東西..我需要修改在回調中的計時器..它即時嘗試避免。 我可以把它包裝在外部班級,這是我不想做的事情。 –

+1

這是一個非常常見的使用計時器的方法。據我所知,.NET不提供一個計時器來爲你做這件事。 – HHLV