我会做一个计时器,行为是这样的:定时器杀死任务/工作,如果它的运行速度比计时器时间间隔较长
如果处理任务/作业的时间小于定时间隔,启动计时器(timer.interval - 处理时间工作/工作)
如果处理作业的时间/任务比计时器间隔多,开始立刻
代码下面的作品接下来的工作/任务,但我想如T知道为什么必须首先完成ElapsedEventHandler方法作业/任务,然后我们可以设置新的计时器间隔。时间间隔过去后引发System.Timers.Timer事件。使用AutoReset = false选项,我们设置Timer在第一个时间间隔过后仅提升Elapsed事件一次。我们必须手动调用Timer.Start()来重新启动它。
using System;
using System.Timers;
namespace TestTimer
{
class Program
{
private static Timer t;
private static double intervalMiliseconds;
static void Main(string[] args)
{
intervalMiliseconds = 5000; // 5 seconds
t = new Timer();
t.Interval = intervalMiliseconds;
t.AutoReset = false;
t.Elapsed += new ElapsedEventHandler(OnTimedEvent);
t.Start();
log("Timer started at " + DateTime.Now.ToString());
log("Interval is: " + defaultIntervalMiliseconds);
Console.ReadKey();
}
private static void log(string text)
{
Console.WriteLine(text + "\n");
}
private static void OnTimedEvent(object source, ElapsedEventArgs e)
{
// if t.Interval is set here thread just kills the job if it
// runs longer than interval
t.Interval = intervalMiliseconds;
log("ElapsedEvent triggered at " + DateTime.Now.ToString());
// job
DateTime startTime = DateTime.Now;
log("job started");
System.Threading.Thread.Sleep(8000); // 8 sec
log("job ended");
TimeSpan jobTime = DateTime.Now.Subtract(startTime);
log("job took " + jobTime.TotalSeconds + " seconds");
// if we set t.Interval here it works so first the job
// must be done and than we can set timer interval ? why ?
//t.Interval = intervalMiliseconds;
if (jobTime.TotalMilliseconds < t.Interval)
{
t.Interval = t.Interval - jobTime.TotalMilliseconds;
log("Job ended Earlier starting Event in: " + t.Interval);
}
else
{
t.Interval = 100;
log("Job overpass interval. Current time: " +
DateTime.Now.ToString());
}
t.AutoReset = false;
t.Start();
}
}
}
结果呢:
如果我们方法OnTimedEvent并取消t.Interval的工作之后开始评论t.Interval所做的一切工作。这个结果:
为什么我们不能在方法OnTimedEvent开始设置计时器的时间间隔。如果我们这样做,如果任务/作业的运行时间超过了定时器时间间隔,线程就会杀死作业。我真的很感激,如果有人有一些想法?这是否与线程与主线程(哪个定时器运行)的synhronization有关?当我们调用方法OnTimedEvent时,定时器不会再次调用该方法,因为它具有AutoReset = false,它与我们设置定时器属性的位置有什么不同?
虽然我还没有读过你的整个问题,但为什么不在工作_start_上启动计时器。作业完成后,如果计时器已过,则启动另一个作业,否则等待计时器过去。 –