в моем приложении у меня есть «биение» функциональность, которая в настоящее время реализуется в длинной бегущей нити следующим образом (псевдокод):Heartbeat реализация с Thread.Sleep()
while (shouldBeRunning)
{
Thread.Sleep(smallInterval);
if (DateTime.UtcNow - lastHeartbeat > heartbeatInterval)
{
sendHeartbeat();
lastHeartbeat = DateTime.UtcNow;
}
}
Теперь, случается, что когда мое приложение проходит некоторое интенсивное время процессора (несколько минут тяжелых вычислений, в которых процессор занимает 90%), сердечные удары задерживаются, даже если smallInterval < < heartbeatInterval.
Чтобы хрустить некоторые цифры: heartbeatInterval - 60 секунд, lastHeartbeat - 0,1 секунды, а сообщенная задержка может достигать 15 секунд. Таким образом, по моему мнению, это означает, что Sleep (10) может длиться, как Sleep (15000), когда процессор очень занят.
Я уже пробовал устанавливать приоритет потока как AboveNormal - как я могу улучшить свой дизайн, чтобы избежать таких проблем?
Почему бы не использовать таймер для этого? –
Плохой дизайн, в основном :) Я, безусловно, перехожу к более надежному решению (и таймеры - самая очевидная вещь), но в этот момент мне любопытно поведение. – Andrea
@ Andrea - исправить ваш дизайн. Проблема, с которой вы столкнулись, является причиной создания класса Timer. Обратите внимание, что вы по-прежнему будете во власти .NET Scheduler. –