C #: Что делать, если интервал System.Windows.Forms.Timer был недостаточен для выполнения работы? - PullRequest
0 голосов
/ 29 июня 2010

Во-первых, извините за плохое английское письмо.

Предположим, у нас есть выигрышная форма (C #) с таймером.Интервал таймера был установлен на 60000 милсек.Таким образом, его событие тика будет запускаться каждые 1 минуту.Предположим, мы написали метод, который обрабатывает тиковое событие под названием Timer1_Tick.Что если для выполнения задания требуется больше 1 минуты?

Ответы [ 7 ]

2 голосов
/ 29 июня 2010

У вас есть несколько вариантов, вот четыре, которые я могу вспомнить:

  1. Отмените текущую работу, чтобы начать новую.Большим недостатком этого является, конечно, если текущее задание не может быть остановлено.
  2. Дождитесь окончания текущего задания, прежде чем начинать новое.Это может оставить вас в очереди ожидающих заданий, если каждое из них занимает более минуты.
  3. Не запускайте новое задание.Дайте текущему завершиться, а затем дождитесь следующего интервала таймера, чтобы начать новое задание.
  4. Увеличьте интервал между заданиями.Это только откладывает проблему.

Нет правильного ответа.Вы должны решить, что лучше и подходит для вашей ситуации.

Я бы выбрал # 3 в качестве моего первого решения.

2 голосов
/ 29 июня 2010

Установите флаг, который позволит вам проверить, завершено ли длительное задание, и запускать его только после его завершения.Не забудьте сбросить флаг после завершения длительного выполнения задания:

// field
private bool finishedWork = true;

public void Timer1_Tick(Object o, EventArgs e)
{
   if (finishedWork)
   {
     finishedWork = false;

     // do work

     finishedWork = true;
   }
}

Другой вариант - просто отключить таймер между операциями:

public void Timer1_Tick(Object o, EventArgs e)
{
   if (finishedWork)
   {
     Timer1.Enabled = false;

     // do work

     Timer1.Enabled= true;
   }
}
1 голос
/ 29 июня 2010

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

Вы выдвигаете рабочую нить для выполнения работы?

1 голос
/ 29 июня 2010

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

Обратите внимание, если ваша функцияВыполнение занимает более 2 минут, возможно (читай: скорее всего), что в очереди будет только самый последний тик.

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

0 голосов
/ 29 июня 2010

В .Net имеется несколько типов таймеров: один находится в пространстве имен System.Timers, другой - в пространстве имен System.Windows.Forms, а другой - в System.Threading.

Элемент управления System.Windows.Forms.Timer основан наПоток пользовательского интерфейса и циклы сообщений означают, что он будет помещать в очередь события таймера, и если ваш обработчик превысит интервал, он будет вызван сразу после завершения.

Два других таймера основаны на потоке и очень точны.Они вернутся к вам обработчик по истечении времени.

0 голосов
/ 29 июня 2010

Отключить таймер в начале Timer1_Tick, а затем включить его снова?

0 голосов
/ 29 июня 2010

Сохранение текущего состояния процесса в поле или свойстве и запуск процесса только в том случае, если состояние не «работает».

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