Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C定时计时器考虑回调时间_C#_Timer - Fatal编程技术网

C# C定时计时器考虑回调时间

C# C定时计时器考虑回调时间,c#,timer,C#,Timer,我想有一个计时器,考虑到回调调用时间,它的时间间隔 例如,如果计时器间隔为1000毫秒,则回调调用大约需要500毫秒, 然后t0=0,t1=1500,t2=3000 显然,我不想将调用时间(或其平均值)存储在字段中,我希望它尽可能完美地工作 我有点解决了,但看起来很糟糕 System.Timers.Timer timer = new System.Timers.Timer(1000); timer.Elapsed += (sender, args) => { timer.Stop(

我想有一个计时器,考虑到回调调用时间,它的时间间隔

例如,如果计时器间隔为1000毫秒,则回调调用大约需要500毫秒, 然后t0=0,t1=1500,t2=3000

显然,我不想将调用时间(或其平均值)存储在字段中,我希望它尽可能完美地工作

我有点解决了,但看起来很糟糕

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#中已有任何内置功能?

您可以使用dueTime为1000和无限周期的
System.Threading.Timer

using System.Threading;

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

然后在回调方法结束时,调用
timer.Change(1000,Timeout.Infinite)
,这将导致回调在完成后调用1000毫秒,而不管回调执行需要多长时间。

您可以使用dueTime为1000且无限期的
System.Threading.timer

using System.Threading;

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

然后在回调方法的末尾,调用
timer.Change(1000,Timeout.Infinite)
,这将导致回调在完成后调用1000毫秒,而不管回调执行多长时间。

这看起来完全等同于使用
Sleep(1000)运行
线程
结束。请忽略调用中的线程睡眠。Thread.sleep并不是在timer处理线程时从线程池中释放线程。我认为@Sinatr的意思是,您想要的相当于运行该方法,然后在循环中的一个单独线程中睡眠1秒。你不需要定时器来完成这个任务。@PeterBons,但为什么?计时器在操作之间等待时未锁定线程。线程。睡眠可以。然后使用任务。延迟…看,我们正在布置一些选项。如果您不想修改回调方法中的计时器,那么您显然需要其他东西。这看起来完全等同于使用
Sleep(1000)运行
Thread
结束。请忽略调用中的线程睡眠。Thread.sleep并不是在timer处理线程时从线程池中释放线程。我认为@Sinatr的意思是,您想要的相当于运行该方法,然后在循环中的一个单独线程中睡眠1秒。你不需要定时器来完成这个任务。@PeterBons,但为什么?计时器在操作之间等待时未锁定线程。线程。睡眠可以。然后使用任务。延迟…看,我们正在布置一些选项。如果您不想修改回调方法中的计时器,那么显然需要其他东西。因此基本上是一样的。。我需要修改回调中的计时器。。这是我试图避免的。我可以把它封装在一个外部类中,这是我不想做的事情。这是使用计时器的一种非常常见的方法。据我所知,.NET没有为您提供计时器,所以它基本上是一样的。。我需要修改回调中的计时器。。这是我试图避免的。我可以把它封装在一个外部类中,这是我不想做的事情。这是使用计时器的一种非常常见的方法。据我所知,.NET没有为您提供计时器。