我有一个System.Timers.Timer(即使Threading.Timer更强大,我需要重启选项),它应该调用事件(函数)进行数据交换。 我的计时器初始化:
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()
只是重新启动Elapsed Event,而不是等待intervall时间。
你能否告诉我,如果我误解了MSDN-Site / Timer遇到了一些问题以及如何修复它们/或者我的代码搞砸了:)
由于
编辑: 解决问题,感谢Hans Passant。 我正在使用秒,程序将其解释为毫秒。
答案 0 :(得分:0)
如果我理解正确,你想在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;
}
}
}
}
答案 1 :(得分:0)
而不是bool我建议你尝试锁定。这里是修改代码的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;
}
}
}
}