System.Timers.Timer vs System.Threading.Timer
В последнее время я проверял некоторые из возможных таймеров, а Threading.Timer и Timers.Timer - это те, которые кажутся мне полезными (поскольку они поддерживают объединение потоков).
Я делаю игру, и я планирую использовать все типы событий с разными интервалами и т.д.
Что было бы лучше?
Ответы
Ответ 1
В этой статье представлено довольно полное объяснение:
" Сравнение классов таймера в библиотеке классов .NET Framework" - также доступно в качестве файла .chm
Конкретная разница заключается в том, что System.Timers.Timer
ориентирован на многопоточные приложения и поэтому является потокобезопасным с помощью своего свойства SynchronizationObject
, тогда как System.Threading.Timer
по иронии судьбы не является потокобезопасным из коробки.
Я не считаю, что существует разница между ними, поскольку она относится к тому, насколько малы ваши интервалы.
Ответ 2
System.Threading.Timer
- простой таймер. Он вызывает вас в потоке пула потоков (из рабочего пула).
System.Timers.Timer
- это System.ComponentModel.Component
, который обертывает System.Threading.Timer
и предоставляет некоторые дополнительные функции, используемые для отправки по определенному потоку.
System.Windows.Forms.Timer
вместо этого переносит собственный message-only-HWND и использует Таймеры окна, чтобы поднять события в этом цикле сообщений HWND.
Если ваше приложение не имеет пользовательского интерфейса, и вам нужен самый легкий и универсальный таймер .Net, (потому что вы счастливы выяснить свою собственную потоковую передачу/диспетчеризация), то System.Threading.Timer
так же хорош, как и в рамках.
Я не совсем понимаю, что такое "небезопасные" проблемы с System.Threading.Timer
. Возможно, это так же, как и в этом вопросе: Thread-safety System.Timers.Timer vs System.Threading.Timer, или, возможно, все просто означают, что:
Ответ 3
В своей книге " CLR Via С#", Jeff Ritcher обескураживает использование System.Timers.Timer
, этот таймер получен из System.ComponentModel.Component
, что позволяет использовать его в дизайне поверхности Visual Studio. Так что это было бы полезно только, если вы хотите использовать таймер на поверхности дизайна.
Он предпочитает использовать System.Threading.Timer
для фоновых задач в потоке пула потоков.
Ответ 4
System.Timers.Timer
, кажется, устарел с .NET Core и ASP.NET Core.
Поэтому попробуйте использовать System.Threading.Timer
в будущих приложениях.
EDIT:
Хорошо, позвольте мне уточнить:
С новой платформой .NET Core Framework Microsoft прекратила некоторые технологии .NET Framework. Чтобы понять это:.NET Core - это совершенно новая структура - переписанная, перекрестная платформа и т.д. Я не хочу углубляться здесь подробно - пожалуйста, прочитайте Блог .NET.
В блоге хорошая статья изобилует переносом на .NET Core, который также объясняет трудности, с которыми вы можете столкнуться. Одна из них заключается в использовании .NET Portability Analyzer Visual Studio Add-In и исправления ошибок, которые вы получаете.
Для класса System.Timers.Timer
он сказал, что поддерживается .NET Framework, версия = v4.6.2, но .NET Core, Version = v5.0 и
.NETPlatform, версия = v5.0 - нет. Рекомендуемые изменения: Use System.Threading.Timer
.
Итак, для меня это выглядит так: System.Timers.Timer
для .NET Core.
P.S.: Но он может вернуться - Microsoft объявила, что хочет внести некоторые изменения в CoreCLR (имя фреймворка, используемого для .NET Core), чтобы упростить перенос.
Ответ 5
Одно важное отличие, не упомянутое выше, которое может вас уловить, состоит в том, что System.Timers.Timer
молчаливо проглатывает исключения, тогда как System.Threading.Timer
не делает.
Например:
var timer = new System.Timers.Timer { AutoReset = false };
timer.Elapsed += (sender, args) =>
{
var z = 0;
var i = 1 / z;
};
timer.Start();
против
var timer = new System.Threading.Timer(x =>
{
var z = 0;
var i = 1 / z;
}, null, 0, Timeout.Infinite);
Ответ 6
Я нашел небольшое сравнение MSDN
Библиотека классов .NET Framework включает в себя четыре класса с именем Timer, каждый из которых предлагает разную функциональность:
System.Timers.Timer
, который запускает событие и выполняет код в одном или нескольких приемниках событий через равные промежутки времени. Класс предназначен для использования в качестве серверного или служебного компонента в многопоточном Окружающая среда; он не имеет пользовательского интерфейса и не отображается во время выполнения.
System.Threading.Timer
, который выполняет единый метод обратного вызова в потоке пула потоков через равные промежутки времени. Метод обратного вызова определяется, когда таймер создан и не может быть изменен. Как Класс System.Timers.Timer, этот класс предназначен для использования в качестве серверный или сервисный компонент в многопоточной среде; Это не имеет пользовательского интерфейса и не отображается во время выполнения.
System.Windows.Forms.Timer
, компонент Windows Forms, который запускает событие и выполняет код в одном или нескольких приемниках событий на регулярной интервалы. Компонент не имеет пользовательского интерфейса и предназначен для использования в однопоточной среде.
System.Web.UI.Timer
, компонент ASP.NET, который выполняет асинхронные или синхронные обратные передачи веб-страниц с регулярным интервалом.
Ответ 7
Два класса функционально эквивалентны, за исключением того, что System.Timers.Timer
имеет возможность вызывать все свои обратные вызовы с истечением срока действия через ISynchronizeInvoke, установив SynchronizingObject. В противном случае оба таймера вызывают обратные вызовы на конец потока потоков потоков.
Когда вы перетаскиваете System.Timers.Timer
на поверхность дизайна Windows Forms, Visual Studio устанавливает SynchronizingObject в объект формы, что вызывает все обратные вызовы выноса, которые должны быть вызваны в потоке пользовательского интерфейса.
Ответ 8
Из MSDN: System.Threading.Timer
- простой, легкий таймер, который использует методы обратного вызова и обслуживается потоками пула потоков. Он не рекомендуется использовать с Windows Forms, поскольку его обратные вызовы не встречаются в потоке пользовательского интерфейса. System.Windows.Forms.Timer
- лучший выбор для использования с Windows Forms. Для серверных функций таймера вы можете использовать System.Timers.Timer
, который вызывает события и имеет дополнительные функции.
Источник