Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 长时间(24小时或更长)等待的正确计时器是什么?_C#_Timer_Sleep_Wait - Fatal编程技术网

C# 长时间(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

等待24小时+/-1秒的最佳方式是什么。我知道线程。长时间睡眠是不准确的,并且会根据CPU负载的不同而变化

我看到System.Timers.Timer允许您创建定时事件。我如何使用它来简单地等待24小时

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需要重置。您需要一个外部调度机制,将下一次运行时写入数据库并定期检查数据库。