Какой таймер использовать для ожидания в течение длительного времени (24 часа и более)? - PullRequest
4 голосов
/ 06 октября 2011

Как лучше всего подождать 24 часа +/- 1 секунду. Я знаю, что Threading.Sleep в течение длительного времени не является точным и может варьироваться в зависимости от загрузки процессора.

Я вижу, что 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);
    }

Ответы [ 5 ]

3 голосов
/ 06 октября 2011

Может быть, Quartz.NET - это то, что вы ищете.http://quartznet.sourceforge.net/.

2 голосов
/ 06 октября 2011

+ / - 1 секунда?Я бы использовал гибридный подход.

Использование планировщика задач для запуска программы, в 23:58.Затем оставьте эту программу на 2 минуты или менее, пока не наступит точный момент, затем выполните работу.

Если вам не нужна точность с точностью до 1 секунды, вы можете просто использовать планировщик задач отдельно, на 24-часовом делении.

0 голосов
/ 12 мая 2013

Может быть, это лучше, если вы действительно хотите использовать таймер.

    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);
     }

Но мне немного неясно, почему ManuelResetEvent не делает эту работу проще ...

0 голосов
/ 06 октября 2011

Я думаю, вы можете использовать комбинацию ManualResetEvent вместе с таймером.

0 голосов
/ 06 октября 2011

Предполагается, что вы находитесь в выигрышных формах.

Объявите переменную даты и времени и присвойте значение в событии form_load.Создайте таймер и запускайте событие каждую секунду.Проверьте переменную datetime в событии таймера.если интервал времени составляет 1 час, вызовите ваш основной метод.

...