[英]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.