Функция CWnd::SetTimer
, на которую вы смотрите, создает таймер, который отправляет в окно события WM_TIMER
.Это аналог компонента System.Windows.Forms.Timer в .NET.Он ведет себя несколько иначе, чем System.Timers.Timer
.Есть два отличия, которые особенно актуальны:
Windows.Forms.Timer
вызывает обработчик событий в потоке пользовательского интерфейса.По умолчанию System.Timers.Timer
вызывает обработчик событий в потоке потоков.Вы можете использовать свойство SynchronizingObject для вызова System.Timers.Timer
в потоке пользовательского интерфейса.
Другое отличие состоит в том, что невозможно избежать проблем с повторным входом с таймером Windows Forms, потому что Windows не будетразрешить несколько WM_TIMER
сообщений от одного и того же таймера в очереди, и при этом он не будет помещать сообщение WM_TIMER
в очередь, если оно уже обрабатывается.Как правило, это хорошо.
System.Timers.Timer
, с другой стороны, разрешит повторный вход.Поэтому, если ваш обработчик событий таймера занимает больше времени, чем период таймера, вы можете обрабатывать несколько событий для одного и того же таймера одновременно.Если период таймера составляет 100 мс, а обработка занимает 150 мс, вы получите другое уведомление, пока обрабатываете первое.Если вы используете SynchronizingObject
для принудительного обратного вызова в потоке пользовательского интерфейса, это может привести к тому, что целый ряд ожидающих обратных вызовов будет поставлен в очередь.
Реализация двух таймеров весьма различна.Таймер Windows Forms использует старые таймеры Windows , которые существуют уже 20 лет.Этот тип таймера требует дескриптора окна и цикла сообщений и поэтому используется только в программах с графическим интерфейсом.System.Timers.Timer
- это тонкая оболочка вокруг System.Threading.Timer
, которая использует Windows Таймеры пула потоков .