我开发了Windows服务&在widows服务中使用了system.threading.timer。在此,定时器工作正常,但有时它会改变执行的时间,例如我将计时器设置为10秒,然后每10秒执行一次,但有时它会在11秒开始。我有这个输出
18-08-2011 10:00:10 18-08-2011 10:00:10 18-08-2011 10:00:20 18-08-2011 10:00:30 18-08-2011 10:00:40 18-08-2011 10:00:11 18-08-2011 10:00:22 18-08-2011 10:00:33 18-08-2011 10:00:44
但我希望输出为
18-08-2011 10:00:10 18-08-2011 10:00:20 18-08-2011 10:00:30 18-08-2011 10:00:40 18-08-2011 10:00:50 18-08-2011 10:00:00 18-08-2011 10:00:10 18-08-2011 10:00:20
我使用过system.threading.timer
public void SetTimers(int timer, DataRow row) { TimeSpan dueTime; TimeSpan interval; SetTimeIntervals(row, out dueTime, out interval); timer1[timer] = new System.Threading.Timer(databaseTrensfer, row, dueTime, interval); } private void SetTimeIntervals(DataRow row, out TimeSpan tsDueTime, out TimeSpan tsPeriod) { string alarmType = Convert.ToString(row["EBase"]); string EType = Convert.ToString(row["EType"]); string EFrequency = Convert.ToString(row["EFrequncy"]); if (alarmType == "Millisecond") { int frquency1 = Convert.ToInt32(row["Tfrquency"]); tsDueTime = new TimeSpan(0, 0, 0, 0, frquency1);//frquency1=interval timing tsPeriod = new TimeSpan(0, 0, 0, 0, frquency1); } else if (alarmType == "Second") { int frquency1 = Convert.ToInt32(row["Tfrquency"]); tsDueTime = new TimeSpan(0, 0, 0, frquency1); tsPeriod = new TimeSpan(0, 0, 0, frquency1); } else if (alarmType == "Once") { tsDueTime = new TimeSpan(0, 0, 0); tsPeriod = new TimeSpan(0, 0, 0); } else if (alarmType == "Minute") { int frquency1 = Convert.ToInt32(row["Tfrquency"]); tsDueTime = new TimeSpan(0, frquency1, 0); tsPeriod = new TimeSpan(0, frquency1, 0); } else if (alarmType == "Hour") { int minute = 0; int frquency1 = 1; if (Convert.ToString(row["RelativeFactor"]) != "") minute = Convert.ToInt32(row["RelativeFactor"]); if (Convert.ToString(row["Tfrquency"]) != "") frquency1 = Convert.ToInt32(row["Tfrquency"]); tsDueTime = new TimeSpan(frquency1, minute, 0); tsPeriod = new TimeSpan(frquency1, 0, 0); } else { tsDueTime = new TimeSpan(); tsPeriod = new TimeSpan(); } }
提前致谢
答案 0 :(得分:2)
我非常担心在活动之间需要这么精确的间隔。如果确实需要这样的准确度,通常需要设置间隔小得多的计时器,然后检查是否已达到正确的时间以执行下一步操作。
E.g。如果你想要10秒的间隔,并且想要避免11秒的间隔,你可以将定时器间隔设置为0.1秒,如果你上次做了不到10秒就不做任何事情。
或者,您可以将间隔设置为10秒,但是可以测量计时器流逝的频率,并改变间隔以将平均间隔转回10秒 - 如果您只有11秒的间隔时间,将计时器更改为9(或9.5)秒,直到平均值返回10秒。