簡體   English   中英

如何准確設置時間段

[英]how to set exactly time period

如果我像這樣使用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分鍾后完全喚醒,請告訴我如何完成它。

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

使用Timer而不是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;
    }
}

在任何一種情況下,間隔都會在過去時立即重置,因此您的記錄將是准確的(至少下降到秒)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM