我正在尝试每t个时间调用一个方法f(),但是如果之前的f()调用尚未完成,请等待完成.
我已经读了一些可用的计时器(this is a useful link),但找不到任何好的方式来做我想要的,除了手动编写所有这些.任何关于如何实现这一点的帮助将不胜感激,尽管我担心我可能无法使用计时器找到一个简单的解决方案.
为了澄清,如果t是一秒钟,f()运行我在下面写的任意持续时间,那么:
Step Operation Time taken 1 wait 1s 2 f() 0.6s 3 wait 0.4s (because f already took 0.6 seconds) 4 f() 10s 5 wait 0s (we're late) 6 f() 0.3s 7 wait 0.7s (we can disregard the debt from step 4)
请注意,这个定时器的性质是f()对于重新进入而言不需要安全,而在这里,大小为1的线程池就足够了.
解决方法
你可以使用一个’全局’级别的var(或更有可能的是与f()相同的类中的一个public属性),如果f()已经在运行,则返回true.
因此,如果f()在一个名为TimedEvent的类中,则f()将首先设置为运行true
这样你的定时器每秒钟触发一次,然后启动定时事件,如果它没有运行
if(!timedEvent.Running)timedEvent.f()
你评论说如果花费比定时器间隔更长的时间,f()将立即重复.这是一个公平的点我可能会在f()中包含这样的逻辑,以便Running保持原样.所以看起来像这样:
public void f(int t) // t is interval in seconds { this.running = true; Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); do { stopwatch.Reset(); // Do work here } while (stopWatch.Elapsed.Seconds > t); // repeat if f() took longer than t this.running = false; }