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

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

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

Ответы на вопрос(3)

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

 06 мая 2012 г., 17:07
Семафор может работать, но простой логический флаг может вызвать проблемы. Не забывайте, что таймер запускает новый поток для каждого выполнения .....
 06 мая 2012 г., 17:24
простого булева, да, недостаточно для быстрого таймера, но для долгого (& gt; 200 мс) таймера риск двойного повторного входа кажется довольно нулевым.
 24 мая 2017 г., 11:24
Сначала, @MartinJames комментарий озадачил меня [Есть много ситуаций, когдаSleep должно бытьavoided, не рекомендуется], но после внимательного прочтенияhis answer elsewhereЯ действительно рекомендую это (хотя см. Мое рекомендуемое изменение в комментарии там).
 06 мая 2012 г., 17:27
Да, но вы знаете, когда есть редкий шанс, что что-то подобное произойдет, вы можете быть уверены, что это произойдет ... "Правило неопределенности" информатики :-)
 06 мая 2012 г., 17:39
:-) если вы поместите логику, управляющую логическим значением (если (FunctionExecuting), то верните; FunctionExecuting = True;) в начале функции, шансы, чтоTWO произойдет повторный входящий вызовat the same time для такого короткого кода с & gt; 200 мс ... я не знаю, как сказать, насколько низок ... Вы не говорите о законе Мерфи? :-)
Решение Вопроса

System.Threading.Timer или жеSystem.Timers.Timer, таймер снова будет отмечен, начиная новую тему. Увидетьhttps://stackoverflow.com/a/10442117/56778 чтобы избежать этой проблемы.

System.Windows.Forms.Timerзатем новый тик не произойдет, пока предыдущий не закончит обработку.

 Farshid06 мая 2012 г., 16:48
Большое спасибо. Ваш ответ просветляет.
 06 мая 2012 г., 16:39
Это верно. Лично я даже не использую таймеры .NET, но реализую свои собственные; Которые используют потоки так, как мне нужно для конкретного приложения, и определяют логику новых тиков более подходящим способом. Если у вас есть проблема с таймерами .NET поведение, я предлагаю вам сделать то же самое.
 06 мая 2012 г., 21:59
@ daniel.gindi: Интересно. У меня никогда не было проблем с таймерами .NET, если я не пытался сделать что-то, что требовало разрешения лучше, чем 15 мс. По моему опыту, если ваша обработка не успевает за частотой таймера, вам нужно замедлить таймер или оптимизировать обратный вызов таймера. Но реализовать свои таймеры? Похоже, много работы за небольшую выгоду.
 08 мая 2012 г., 08:32
@JimMischel Я не думаю, что вы хотите рассчитывать на то, сколько времени вы выполняете и сколько времени занимает. Вы будете намного безопаснее, если будете делать это правильно. Вы не можете разрешить возможные условия гонки, вы никогда не можете знать, что произойдет. - И вы будете удивлены, насколько просто реализовать свой таймер :-)

Monitor.TryEnter()

object timeCheck= new object();

void Timer()
{
    Monitor.TryEnter(timeCheck) 
    {
        //Code that might take too long 
        //...
        Monitor.Exit();
    }
}
 03 июн. 2017 г., 02:05
@ToolmakerSteve спасибо за исправление.
 08 мая 2012 г., 14:27
Я второй это. Необходимо следить за блокировкой / Monitor.TryEnter без тайм-аута, так как это потенциально поставит в очередь загрузки потоков. TryEnter с тайм-аутом, не превышающим ваш интервал, является абсолютным минимумом здесь.
 24 мая 2017 г., 11:38
Я проголосовал за комментарий @ MAfifi, прежде чем понял, что он не прав.TryEnter with no time interval parameterили с нулевым интервалом времени,never blocks (См. «Примечания» в связанном документе).

Ваш ответ на вопрос