Таймер более надежный, чем System.Threading.Timer

В настоящее время я использую System.Threading.Timer с интервалом в 10 секунд. Я добавляю небольшой кусок кода для записи в файл каждый раз, когда срабатывает таймер, и в то время как большую часть времени он срабатывает вовремя, иногда (предположительно, когда остальная часть приложения покупается), не срабатывает в течение 30 или 40 секунд, и срабатывает снова и снова в быстрой последовательности.

Есть ли более надежный таймер, который я могу использовать в .NET 3.5?

Таймер устанавливается следующим образом

Timer someTimer = new Timer(new TimerCallback(SomeMethod), null, 0, 10000);

... и обратный вызов:

private static void SomeMethod(object state)

Однако сложнее предоставить гораздо больше кода, чем это, поскольку таймер обычно срабатывает правильно. Когда он встроен в массивное приложение (около 100 000 строк или около того), при запуске многолистных потоков, слева, справа и в центре вы медленно начинаете наблюдать за запуском таймера. Я видел несколько сообщений о том, что ThreadPool может быть исчерпан, поэтому в настоящее время я просматриваю, может ли это быть тем, что я испытываю.

Ответ 1

Это звучит точно так же, как голодный пул потоков. Следите за длинными работающими/блокирующими заданиями, запущенными в пуле потоков, и либо переписывайте с помощью async io, либо в случае длительных рабочих нагрузок с интенсивным процессором, просто не выполняйте эти задания в пуле потоков. Запустите их в своем потоке или используйте фона рабочего.

Ответ 2

Обратитесь к другим классам таймера в .net

Different Timer class in .net

В .NET есть три класса таймера под названием "Таймер". Похоже, что вы используете Windows Forms, но на самом деле вы можете найти класс System.Threading.Timer более полезным - но будьте осторожны, потому что он обращается к потоку пула, поэтому вы не можете напрямую взаимодействовать с вашей формой из обратный вызов.

Более точный таймер - согласно MSDN

Компонент Timer Windows Forms является однопоточным и ограничен точностью до 55 миллисекунд. Если вам требуется многопоточный таймер с большей точностью, используйте класс Timer в пространстве имен System.Timers.