Windows服务中的System.Threading.Timer时间间隔

我已经开发了Windows服务&寡妇服务使用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();
            }      

        }

提前致谢


我会非常警惕在活动之间需要确切的时间间隔。 如果您确实需要这样的准确性,您通常必须设置一个间隔小得多的计时器,然后检查是否已经达到了正确的时间来执行下一个操作。

例如,如果你想要10秒的时间间隔,并且希望避免11秒的时间间隔,那么你应该将计时器时间间隔设置为0.1秒,然后如果自上次做了一些事情之后少于10秒,就不做任何事情。

或者,您可以一般保留10秒的时间间隔,但可以测量计时器的流逝频率并更改时间间隔以将平均时间间隔恢复为10秒 - 如果您刚刚有几个11秒的时间间隔,请更改计时器为9(或9.5)秒,直到平均回到10秒。

链接地址: http://www.djcxy.com/p/46571.html

上一篇: System.Threading.Timer interval in Windows Service

下一篇: observable collection not getting updated on UI change