[英]Windows Service with System.Threading.Timer action for an interval within a range
[英]System.Threading.Timer interval in Windows Service
我開發了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秒。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.