Таймер C# по сравнению с потоком в обслуживании

У меня есть Сервис, который поражает базу данных каждые 10 секунд и получает данные, если существует кто-либо. Вещь состоит в том, что обработка этих данных может занять до 30 секунд. Если я буду использовать Таймер с интервалом 10 секунд, то сервис получит те же данные дважды.

Эффект я пытаюсь достигнуть (Только для визуализации):

while(true)
{
    if(Getnrofrows() > 0)
      do stuff
    else
      sleep for 10 sec
}

Люди, заявляющие Поток. Сон является плохой идеей в услугах по производству, как я делаю это с таймерами?

/ микрофон

7
задан Mike Ribeiro 13 August 2010 в 07:17
поделиться

4 ответа

Вы пытались установить для свойства Timer автоматический сброс значения false и снова включить таймер, когда процесс обновления данных закончился?

using System;

public class PortChat
{
    public static System.Timers.Timer _timer;
    public static void Main()
    {

        _timer = new System.Timers.Timer();
        _timer.AutoReset = false;
        _timer.Interval = 100;
        _timer.Elapsed += new System.Timers.ElapsedEventHandler(_timer_Elapsed);
        _timer.Enabled = true;
        Console.ReadKey();
    }

    static void _timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        //Do database refresh
        _timer.Enabled = true;
    }
}
10
ответ дан 6 December 2019 в 22:59
поделиться

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

Чтобы ответить на ваш вопрос:

public class MyTest
{
    System.Threading.Timer _timer;


    public MyTest()
    {
       _timer = new Timer(WorkMethod, 15000, 15000);
    }


    public void WorkMethod()
    {
       _timer.Change(Timeout.Infinite, Timeout.Infinite); // suspend timer

       // do work

       _timer.Change(15000, 15000); //resume

    }
}
1
ответ дан 6 December 2019 в 22:59
поделиться

В этом подходе нет ничего плохого. Спящий поток не потребляет циклов ЦП.

Если вам нужно делать что-то ровно каждые X секунд, лучше всего использовать таймер. Если, с другой стороны, вы хотите сделать паузу на X секунд, тогда подойдет Thread.Sleep.

0
ответ дан 6 December 2019 в 22:59
поделиться

Thread.Sleep сам по себе неплох для службы, просто вам нужно реагировать на команды службы, поэтому рабочий поток не должен переходить в спящий режим на час, но скорее нужно спать на короткие периоды времени, а затем просыпаться и слушать, если часть службы, контролирующая службу, говорит ей остановиться по какой-либо причине.

Вы хотите сделать так, чтобы, если администратор скажет вашей службе остановиться, она остановится достаточно быстро, чтобы не было сообщений о тайм-ауте, в которых администратор не может быть уверен, что ваша служба остановлена, и это безопасно перезагрузить машину или что-то подобное.

0
ответ дан 6 December 2019 в 22:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: