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, который вызывает события и имеет дополнительные функции.

Источник