我得到了一个System.Timers.Timer (即使Threading.Timer 更强大,我也需要重新启动选项),它应该调用一个Event(Function)进行数据交换。我的计时器初始化:
private System.Timers.Timer _scheduler; //on class level
_scheduler = new System.Timers.Timer(double.Parse(Config.TimeIntervall));
_scheduler.AutoReset = false;
_scheduler.Elapsed += (o, args) => InterfaceSingleRun();
_scheduler.Start();
该函数启动一个任务,在finally
语句中我得到了
_scheduler.Start()
重新启动我的计时器,它应该再次开始倒计时间隔
我的问题:我想防止重叠,因为我不知道任务将运行多长时间(取决于服务器),但_schedulter.Start()
只是重新启动已用事件,而不是等待间隔时间。您能否告诉我,如果我只是误解了MSDN站点/计时器遇到了一些问题以及如何解决它们/或者我的代码只是搞砸了:)
谢谢
编辑:解决了这个问题,感谢Hans Passant。我正在使用秒,程序将其解释为毫秒。
如果我理解正确,您希望在timer_tick中的代码运行时防止第二个触发器。
我使用这样的全局布尔值:
class Program
{
private static bool timercodeRunning;
static void Main(string[] args)
{
var timer = new System.Timers.Timer(5000);
timer.Elapsed += timer_Elapsed;
timer.Start();
}
static void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
if (!timercodeRunning)
{
timercodeRunning = true;
try
{
//DO SOME STUFF
timercodeRunning = false;
}
catch (Exception)
{
timercodeRunning = false;
throw;
}
}
}
}
我建议你尝试锁定,而不是布尔值。 这是Gelootn的修改代码
class Program
{
private static object timercodeRunning = new object();
static void Main(string[] args)
{
var timer = new System.Timers.Timer(5000);
timer.Elapsed += timer_Elapsed;
timer.Start();
}
static void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
lock (timercodeRunning)
{
try
{
//DO SOME STUFF
}
catch (Exception)
{
throw;
}
}
}
}