Я разрабатываю приложение, которое запускает System.Threading.Timer, который делает довольно быстрое чтение/запись на последовательный порт (каждые 100 мс). Метод обратного вызова таймера выглядит примерно так: -.Net app thread/timer performance
if (_timerTaskRunning)
{
Debug.WriteLine("still running");
return;
}
_timerTaskRunning = true;
... do the serial write/read here ...
_timerTaskRunning = false;
Флаг _timerTaskRunning
является гарантией для того, чтобы делегат не работает, если предыдущий таймер «цикл» еще не закончен, т.е. он занимает больше времени, чем 100мс ,
Когда я впервые запустил приложение, я вижу около десятка отладочных сообщений из инструкции if
. Затем он опустится, но я увижу еще одну группу сообщений через 7 или 8 секунд. Он снова оседает, и время от времени я вижу, что группа сообщений появляется в разных количествах.
Я предполагаю, что первая группа сообщений вызвана тем, что делегат таймера работает медленно из-за запуска приложения, инициализации объектов/UI и т. Д. И т. Д., В то время как последующие сообщения, возможно, вызваны сбором мусора в каждом так часто и замедляет работу? Это не последовательный порт, потому что я вижу такое же поведение с «макетным» последовательным портом.
Я пробовал задерживать первый запуск таймера на пару секунд, но это не имеет значения. Я все еще получаю пакет отладочных сообщений в течение первой секунды или около того после запуска таймера. Это не конец света, который пропускает некоторые задачи таймера, но было бы интересно узнать, что может их вызвать. Есть ли что-нибудь, что я могу сделать, чтобы исследовать причину дальше, например. ли персмол пролить свет на вещи? Я не использовал его раньше, чем вы могли бы подсказать?
Что вы здесь делаете? ... записывайте/читайте здесь ...?? –
Ваш код чтения/записи может выполняться одновременно на двух отдельных потоках. –
@thecoon да, вот где я пишу в последовательный порт, а затем читаю значение обратно. Как упоминалось в моем вопросе, это не последовательные сообщения, вызывающие провалы, поскольку я получаю такое же поведение, используя простой класс «макет». –