2014-01-28 62 views
1

如果我使用了Thread.Sleep這樣如何設置準確的時間段

while (true) 
    { 

     File.AppendAllText(strCurrentPath + @"\TimerLog.txt", "begin " + DateTime.Now.ToString() + "\r\n"); 

     //do some work which will spent time 
     spendTime(); 

     Thread.Sleep(600000);    // sleep 10 mins 

    } // while 

例如,起初它輸出

begin 2014/1/28 12:02:46 

如果螺紋10分鐘後恰好醒來,然後下一個輸出將

begin 2014/1/28 12:12:46 

,但由於功能spendTime()將花費一些時間,所以實際輸出也許

begin 2014/1/28 12:13:10 

我需要的是無論花費多少時間()將花費,線程將在10分鐘後正好醒來,請告訴我如何完成它。

回答

2
while (true) 
{ 
    startTime = Environment.TickCount 
    File.AppendAllText(strCurrentPath + @"\TimerLog.txt", "begin " + DateTime.Now.ToString() + "\r\n"); 

    //do some work which will spent time 
    spendTime(); 

    timeBeforeSleep = Environment.TickCount 
    consumedTime = timeBeforeSleep - startTime 
    Thread.Sleep(600000 - consumedTime);    // sleep 10 mins 

} // while 

但是,如果一段時間比你的時間間隔長,你應該以某種方式處理它。我不知道你想做的事,但你可以跳過這樣的睡眠:)

if(consumedTime < 600000) 
    Thread.Sleep(600000 - consumedTime);    // sleep 10 mins 
+0

謝謝,你的代碼有效 – yangl

0

使用定時器代替了Thread.Sleep(

var timer = new Timer(60000); // System.Timers.Timer 
timer.Elapsed += (o, a) => spendTime(); 

這聽起來像在Windows工作順便說一句,服務。這樣你就不用擔心程序退出。

如果你在一個控制檯應用程序的時候,例如,你可以使用System.Threading.Timer與TimerCallback:

using System.Threading; 
... 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Console.WriteLine("Starting"); 

     var timer = new Timer(TimerCallBack, null, 0, 60000); // change 60000 to 6000 for faster testing! 
     Console.ReadLine(); 
    } 

    static void TimerCallBack(object o) 
    { 
     spendTime(); 
    } 

    static void spendTime() 
    { 
     Console.WriteLine("spent time" + DateTime.Now.ToString()); 
     return; 
    } 
} 

在這兩種情況下,間隔立即復位,因爲它的流逝,讓你的日誌將是準確的(至少到第二)。