Я проверить некоторые из возможных таймеров в последнее время, а System.Threading.Timer
и System.Timers.Timer
те , которые выглядят потребного для меня (так как они поддерживают пул потоков).
Я делаю игру, и я планирую использовать все типы событий, с разными интервалами и т. Д.
Что будет лучшим?
Threading.Timer
«ю.ш. статье MSDN , это совершенно поточно- ...System.Threading.Timer
"по иронии судьбы" не потокобезопасен, какSystem.Threading.Thread
и потоки, полученные через пулlock
Тот факт, что эти классы не держат вас в руках и управляют использованием самого ключевого слова, не означает, что эти классы не являются поточно-ориентированными. Вы могли бы также сказатьSystem.Threading.Thread
, что это не потокобезопасность, потому что это так же верно.SynchronizingObject
Не делает объект таймера сам поточно-. Это просто гарантирует, что ваш код для обработки события таймера вызывается в определенном потоке (если вы установите это свойство соответствующим образом). Сам объект таймера не гарантированно является потокобезопасным, как четко указано в документации. С другой стороны,System.Threading.Timer
объект является конкретно документирован как потокобезопасной.System.Threading.Timer
простой таймер. Он вызывает вас обратно в поток пула потоков (из рабочего пула).System.Timers.Timer
этоSystem.ComponentModel.Component
оберткаSystem.Threading.Timer
, и предоставляет некоторые дополнительные функции, используемые для диспетчеризации в определенном потоке.System.Windows.Forms.Timer
вместо этого оборачивает собственный HWND только для сообщений и использует таймеры окон, чтобы вызывать события в этом цикле сообщений HWND.Если ваше приложение не имеет пользовательского интерфейса и вам нужен самый легкий и универсальный таймер .Net, возможный (потому что вы счастливы, вычисляя свою собственную многопоточность / диспетчеризацию), то
System.Threading.Timer
он так же хорош, как и в рамках.Я не до конца понимаю, с чем
System.Threading.Timer
связаны проблемы «не безопасных потоков» . Возможно, это то же самое, что задано в этом вопросе: Потоковая безопасность System.Timers.Timer против System.Threading.Timer , или, возможно, каждый просто означает, что:Легко писать условия гонки, когда вы используете таймеры. Например, смотрите этот вопрос: Таймер (System.Threading) поток безопасности
повторный вход уведомлений таймера, когда ваше событие таймера может вызвать и перезвонить вам во второй раз, прежде чем вы закончите обработку первого события. Например, посмотрите на этот вопрос: поточно-ориентированное выполнение с использованием System.Threading.Timer и Monitor.
источник
System.Timers.Timer
используетSystem.Threading.Timer
внутренне. Смотрите исходный код .В своей книге « CLR Via C # » Джефф Ритчер не рекомендует использовать
System.Timers.Timer
этот таймерSystem.ComponentModel.Component
, что позволяет использовать его в области разработки Visual Studio. Так что это было бы полезно, только если вы хотите, чтобы таймер на поверхности дизайна.Он предпочитает использовать
System.Threading.Timer
для фоновых задач в потоке пула потоков.источник
System.Threading.Timer
похоже на использование пула потоков или создание собственного потока. Из Конечно , эти классы не обрабатывают синхронизацию для вас - это ваша работа! Ни поток пула потоков, ни ваш собственный поток, ни обратный вызов таймера не будут обрабатывать блокировку - для какого объекта и каким образом и при каких обстоятельствах вам нужно блокировать, требуется здравый смысл, а многопоточная версия таймера дает вам большую гибкость и зернистость.Информация от Microsoft об этом (см. Замечания по MSDN ):
Интересно отметить, что
System.Timers.Timer
он устарел в .NET Core 1.0, но был снова реализован в .NET Core 2.0 (/ .NET Standard 2.0). Цель .NET Standard 2.0 состояла в том, чтобы было как можно проще перейти с .NET Framework, что, вероятно, стало причиной его возвращения.Когда он устарел, вместо него рекомендуется использовать надстройку анализатора переносимости .NET Visual Studio
System.Threading.Timer
.Похоже, что Microsoft предпочитает
System.Threading.Timer
раньшеSystem.Timers.Timer
.РЕДАКТИРОВАТЬ ПРИМЕЧАНИЕ 2018-11-15: я передаю свой ответ, так как старая информация о .NET Core 1.0 больше не действительна.
источник
Одно важное отличие, не упомянутое выше, которое может вас поймать, заключается в том, что
System.Timers.Timer
молча проглатывает исключения, аSystem.Threading.Timer
не делает.Например:
против
источник
Я нашел краткое сравнение с MSDN
источник
Эти два класса функционально эквивалентны, за исключением того, что
System.Timers.Timer
имеет возможность вызывать все свои обратные вызовы истечения таймера через ISynchronizeInvoke , устанавливая SynchronizingObject . В противном случае оба таймера вызывают обратные вызовы с истечением срока действия в потоках пула потоков.Когда вы перетаскиваете объект
System.Timers.Timer
на поверхность конструктора Windows Forms, Visual Studio устанавливает SynchronizingObject для объекта формы, что приводит к вызову всех обратных вызовов с истечением срока действия в потоке пользовательского интерфейса.источник
Из MSDN:
System.Threading.Timer
это простой, легкий таймер, который использует методы обратного вызова и обслуживается потоками пула потоков. Это не рекомендуется для использования с Windows Forms, потому что его обратные вызовы не происходят в потоке пользовательского интерфейса.System.Windows.Forms.Timer
это лучший выбор для использования с Windows Forms. Для серверных функций таймера, вы можете рассмотреть возможность использованияSystem.Timers.Timer
, которое вызывает события и имеет дополнительные функции.Источник
источник