System.Timers.Timer против System.Threading.Timer - PullRequest
518 голосов
/ 13 сентября 2009

В последнее время я проверял некоторые из возможных таймеров, и Threading.Timer и Timers.Timer мне кажутся необходимыми (так как они поддерживают пул потоков ).

Я создаю игру и планирую использовать все типы событий с разными интервалами и т. Д.

Что будет лучшим?

Ответы [ 8 ]

347 голосов
/ 13 сентября 2009

Эта статья предлагает довольно полное объяснение:

" Сравнение классов таймеров в библиотеке классов .NET Framework " - также доступно в виде файла .chm

Конкретное отличие заключается в том, что System.Timers.Timer ориентирован на многопоточные приложения и поэтому является поточно-ориентированным благодаря своему свойству SynchronizationObject, тогда как System.Threading.Timer по иронии судьбы не является поточно-ориентированным из коробки.

Я не верю, что между этими двумя понятиями есть разница, так как они касаются того, насколько малы могут быть ваши интервалы.

154 голосов
/ 28 января 2014

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 , или, возможно, каждый просто означает, что:

  1. легко писать условия гонки, когда вы используете таймеры. Например. увидеть этот вопрос: Таймер (System.Threading) безопасности потока

  2. повторный вход уведомлений таймера, когда ваше событие таймера может вызвать и перезвонить вам за секунду времени до того, как вы закончите обрабатывать первое событие. Например. см. этот вопрос: Потоково-безопасное выполнение с использованием System.Threading.Timer и Monitor

117 голосов
/ 12 апреля 2011

В своей книге " CLR Via C # ", Джефф Ритчер не рекомендует использовать System.Timers.Timer, этот таймер является производным от System.ComponentModel.Component, что позволяет использовать его в области разработки Visual Studio. Так что это было бы полезно, только если вы хотите, чтобы таймер на поверхности дизайна.

Он предпочитает использовать System.Threading.Timer для фоновых задач в потоке пула потоков.

34 голосов
/ 21 июня 2016

Информация от Microsoft об этом (см. Замечания по MSDN ):

  • System.Timers.Timer , который запускает событие и выполняет код в одном или нескольких приемниках событий через равные промежутки времени. Класс предназначен для использования в качестве серверного или сервисный компонент в многопоточной среде; у него нет пользователя интерфейс и не виден во время выполнения.
  • System.Threading.Timer , который выполняет один метод обратного вызова в потоке пула потоков в регулярные отрезки. Метод обратного вызова определяется, когда таймер создан и не может быть изменен. Как System.Timers.Timer класс, этот класс предназначен для использования в качестве сервера или службы компонент в многопоточной среде; у него нет пользовательского интерфейса и не виден во время выполнения.
  • System.Windows.Forms.Timer (Только .NET Framework), компонент Windows Forms, который запускает событие и выполняет код в одном или нескольких приемниках событий через равные промежутки времени. Компонент не имеет пользовательского интерфейса и предназначен для использования в однопоточная среда; он выполняется в потоке пользовательского интерфейса.
  • System.Web.UI.Timer (Только .NET Framework), компонент ASP.NET, который выполняет асинхронный или синхронные постбэки веб-страниц с регулярным интервалом.

Интересно отметить, что System.Timers.Timer устарела в .NET Core 1.0, но была снова реализована в .NET Core 2.0 (/ .NET Standard 2.0). Цель .NET Standard 2.0 заключалась в том, чтобы было как можно проще переключиться с .NET Framework, что, вероятно, стало причиной его возвращения.

Когда это устарело, надстройка .NET Анализатор переносимости для .NET рекомендовала использовать System.Threading.Timer вместо.

Похоже, что Microsoft предпочитает System.Threading.Timer до System.Timers.Timer.

РЕДАКТИРОВАТЬ ПРИМЕЧАНИЕ 2018-11-15: Я передаю свой ответ, поскольку старая информация о .NET Core 1.0 больше не действительна.

31 голосов
/ 04 апреля 2016

Одно важное отличие, не упомянутое выше, которое может вас поймать, заключается в том, что 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);
24 голосов
/ 02 октября 2014

Я нашел краткое сравнение с 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, который выполняет асинхронную или синхронную обратную передачу веб-страниц с регулярным интервалом.

1 голос
/ 29 марта 2016

Из MSDN: System.Threading.Timer - это простой, легкий таймер, который использует методы обратного вызова и обслуживается потоками пула потоков. Это не рекомендуется для использования с Windows Forms, потому что его обратные вызовы не происходят в потоке пользовательского интерфейса. System.Windows.Forms.Timer - лучший выбор для использования с Windows Forms. Для серверных функций таймера вы можете использовать System.Timers.Timer, который вызывает события и имеет дополнительные функции.

Источник

1 голос
/ 09 сентября 2015

Два класса функционально эквивалентны, за исключением того, что System.Timers.Timer имеет возможность вызывать все свои обратные вызовы истечения таймера через ISynchronizeInvoke путем установки SynchronizingObject . В противном случае оба таймера вызывают обратные вызовы с истечением срока действия в потоках пула потоков.

Когда вы перетаскиваете System.Timers.Timer на поверхность конструктора Windows Forms, Visual Studio устанавливает SynchronizingObject на объект формы, что приводит к вызову всех обратных вызовов с истечением срока действия в потоке пользовательского интерфейса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...