Подтвердить что ты не робот

Что делать, если таймер не может завершить все свои работы до прибытия нового времени цикла?

Предположим, у нас есть таймер, который запускается каждые 10 минут. Что делать, если цикл его обработки занимает более 10 минут. Для этого начинается новый поток? Прервет ли он свою текущую операцию? Что делать, если один из объектов мутирован внутри таймера?

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

4b9b3361

Ответ 1

Если вы используете System.Threading.Timer или System.Timers.Timer, таймер будет галочкой снова, начиная новый поток. См. fooobar.com/questions/147007/..., чтобы избежать этой проблемы.

Если вы используете System.Windows.Forms.Timer, то новый тик не будет выполняться до тех пор, пока предыдущий не завершит обработку.

Ответ 2

Поместите свой код в Monitor.TryEnter()

object timeCheck= new object();

void Timer()
{
    Monitor.TryEnter(timeCheck) 
    {
        //Code that might take too long 
        //...
        Monitor.Exit();
    }
}

Ответ 3

чтобы предотвратить повторное размещение, вы можете использовать статическое логическое значение, которое сообщает, что функция уже запущена. Пользователь try/Catch/finally и установите для этого boolean значение false в finally, чтобы убедиться, что логическое значение не остается ложным, если вы допустили ошибку в коде или если код не прошел.
Для более быстрого таймера повторное включение должно быть предотвращено с помощью семафора (мьютекс).