2017-02-01 40 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