C# 长时间(24小时或更长)等待的正确计时器是什么?
等待24小时+/-1秒的最佳方式是什么。我知道线程。长时间睡眠是不准确的,并且会根据CPU负载的不同而变化 我看到System.Timers.Timer允许您创建定时事件。我如何使用它来简单地等待24小时C# 长时间(24小时或更长)等待的正确计时器是什么?,c#,timer,sleep,wait,C#,Timer,Sleep,Wait,等待24小时+/-1秒的最佳方式是什么。我知道线程。长时间睡眠是不准确的,并且会根据CPU负载的不同而变化 我看到System.Timers.Timer允许您创建定时事件。我如何使用它来简单地等待24小时 private void myTest{ // SET SOMETHING UP m_theTimer = new System.Timers.Timer(); m_theTimer.Elapsed += new Elap
private void myTest{
// SET SOMETHING UP
m_theTimer = new System.Timers.Timer();
m_theTimer.Elapsed += new ElapsedEventHandler(OurTimerCallback);
const int hrsToMs = 60 * 60 * 1000;
m_theTimer.Interval = TestPeriodHours * hrsToMs;
m_theTimer.Enabled = true;
//---->want to wait for 24 hours<------
// RESUME TEST HERE
VerifySomething()
}
public void OurTimerCallback(object source, ElapsedEventArgs e)
{
Console.WriteLine("Received a callback, the time is {0}", e.SignalTime);
}
private void myTest{
//摆设
m_theTimer=新系统.Timers.Timer();
m_theTimer.appeased+=新的ElapsedEventHandler(我们的Timer回调);
常数int hrsToMs=60*60*1000;
m_theTimer.Interval=测试周期小时数*小时数;
m_theTimer.Enabled=真;
//---->想等待24小时+/-1秒吗?我会使用混合方法
使用任务调度器在23:58启动一个程序。然后让该程序睡眠2分钟或更短时间,直到确切的时刻到来,然后执行该工作
如果您不关心1秒的准确性,您可以在24小时分区中单独使用任务调度器。假设您使用的是win forms
声明datetime变量并在form_load事件上赋值。
创建一个计时器并每秒触发事件。
检查计时器事件中的datetime变量。如果timespan为1小时,请调用您的main方法。也许Quartz.NET就是您要找的。我认为您可以结合使用计时器。如果您真的想使用计时器,这可能会更好
private void myTest{
// SET SOMETHING UP
bool bTimer_Expired = true;
m_theTimer = new System.Timers.Timer();
m_theTimer.Elapsed += new ElapsedEventHandler(OurTimerCallback);
const int hrsToMs = 60 * 60 * 1000;
m_theTimer.Interval = TestPeriodHours * hrsToMs;
m_theTimer.Enabled = true;
//Wait for call back to set flag that the elapsed time has expired
while(!bTimer_Expired)Sleep(1000);
//---->want to wait for 24 hours<------
// RESUME TEST HERE
VerifySomething()
public void OurTimerCallback(object source, ElapsedEventArgs e)
{
bTimer_Expired=true;
Console.WriteLine("Received a callback, the time is {0}", e.SignalTime);
}
private void myTest{
//摆设
bool bTimer_Expired=真;
m_theTimer=新系统.Timers.Timer();
m_theTimer.appeased+=新的ElapsedEventHandler(我们的Timer回调);
常数int hrsToMs=60*60*1000;
m_theTimer.Interval=测试周期小时数*小时数;
m_theTimer.Enabled=真;
//等待回调以设置已用时间已过期的标志
当(!bTimer_过期)睡眠时(1000);
//---->想要等待24小时,只需创建一个计时器,每秒启动一次,并检查是否达到所需的间隔。令人沮丧的部分是测试(并修复,必要时重新测试(一次又一次)).如果你等24小时,测试可能会很痛苦,是的,但谁会这么做?@Dani,好像时间真的站在我这边。这个问题一开始很糟糕,Sleep()准确度绝对不取决于cpu负载。不超过或少于任何其他计时器。它们精确到1/64秒,再加上将代码页故障返回RAM所需的任何时间。我不需要安排任务,只需从程序开始时间起等待24小时。方法仍然相同。启动计时器它会定期检查,但在相当大的时间跨度内,时间是多少(让我们说每分钟一次)。如果你接近目标时间,启动一个分辨率更高的计时器(每秒一次或更频繁).+1来自我。+1.试图用程序内解决方案解决这个问题是行不通的,而且-抱歉-太简单了。24小时是一个logn时间。服务器SOEMTIME需要重置。您需要一个外部调度机制,将下一次运行时写入数据库并定期检查数据库。