Таймер C# или поток. Сон

Или объявите свое поле регистратора как статичное или как переходный процесс.

Оба пути гарантируют writeObject (), метод не попытается записать поле в поток вывода во время сериализации.

Обычно поля регистратора объявляются статичные, но если Вам нужен он, чтобы быть полем экземпляра, просто объявляют его переходный, как его обычно делавшийся для любого несериализуемого поля. После десериализации поле регистратора будет пустым, тем не менее, таким образом, необходимо будет реализовать readObject () метод для инициализации его правильно.

46
задан Doug Porter 9 November 2012 в 16:34
поделиться

9 ответов

class Program
{
    static void Main(string[] args)
    {
        Timer timer = new Timer(new TimerCallback(TimeCallBack),null,1000,50000);
        Console.Read();
        timer.Dispose();
    }

    public static void TimeCallBack(object o)
    {
      curMinute = DateTime.Now.Minute;
      if (lastMinute < curMinute) {
       // do your once-per-minute code here
       lastMinute = curMinute;
    }
}

Код может напоминать приведенный выше

32
ответ дан 26 November 2019 в 20:20
поделиться

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

43
ответ дан 26 November 2019 в 20:20
поделиться

Важно понимать, что ваш код будет спать в течение 50 секунд между завершением одного цикла и началом следующего ...

Таймер будет вызывать ваш цикл каждые 50 секунд, а это не так. t точно так же.

Они оба действительны, но таймер, вероятно, то, что вы здесь ищете.

11
ответ дан 26 November 2019 в 20:20
поделиться

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

4
ответ дан 26 November 2019 в 20:20
поделиться

Помните, что вызов Sleep () заморозит службу, поэтому, если служба будет запрошена на остановку, она не будет реагировать на время вызова Sleep ().

7
ответ дан 26 November 2019 в 20:20
поделиться

Мне требовалось, чтобы поток запускался раз в минуту ( см. Вопрос здесь ), и теперь я использовал DispatchTimer на основе полученных мной ответов .

Ответы содержат некоторые ссылки, которые могут быть вам полезны.

1
ответ дан 26 November 2019 в 20:20
поделиться

Вы можете использовать любой из них. Но я думаю, что Sleep () проще, понятнее и короче в реализации.

0
ответ дан 26 November 2019 в 20:20
поделиться

Не совсем отвечаю на вопрос, но вместо того, чтобы иметь

if (error condition that would break you out of this) {
    break;  // leaves looping structure
}

Вероятно, вам следовало бы иметь

while(condition && !error_condition)

Кроме того, я бы выбрал Таймер .

2
ответ дан 26 November 2019 в 20:20
поделиться

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

Код @Prashanth должен быть именно тем, что вам нужно.

0
ответ дан 26 November 2019 в 20:20
поделиться
Другие вопросы по тегам:

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