Таймеры .NET работают асинхронно? - PullRequest
13 голосов
/ 08 апреля 2009

У меня есть приложение для обмена сообщениями, использующее Jabber-net ( XMPP библиотека .)

То, что я хотел бы сделать, если по какой-то причине соединение с Сервером закончилось, это пытаться установить соединение каждую минуту или около того.

Если я запускаю таймер для ожидания некоторого периода времени перед следующей попыткой, запускается ли этот таймер асинхронно и присоединяется ли полученное событие Tick к основному потоку, или мне нужно будет запустить собственный поток и запустить таймер изнутри есть

Ответы [ 3 ]

35 голосов
/ 08 апреля 2009

Какой таймер вы используете?

  • System.Windows.Forms.Timer будет выполняться в потоке пользовательского интерфейса
  • System.Timers.Timer выполняется в потоке пула потоков, если вы не укажете SynchronizingObject
  • System.Threading.Timer выполняет свой обратный вызов в потоке пула потоков

Во всех случаях сам таймер будет асинхронным - он не будет «занимать» поток, пока не сработает.

1 голос
/ 08 апреля 2009

Я не уверен, как реализованы таймеры в .NET, но если они используют Windows API для создания таймера, цикл сообщений формы получает сообщение WM_TIMER и только при потоке формы не занят, может ли он обработать этот запрос, поэтому таймер сработает в нужное время, но вы можете остановить поток пользовательского интерфейса. Таймер запускается с помощью API SetTimer, и ОС обязательно отправит сообщение WM_TIMER.

Я проверял, только System.Windows.Forms.Timer+TimerNativeWindow.StartTimer(Int32) зависит от:

[DllImport("user32.dll", CharSet=CharSet.Auto, ExactSpelling=true)]
public static extern IntPtr SetTimer(HandleRef hWnd, int nIDEvent, int uElapse, IntPtr lpTimerFunc);

Так что только этот таймер имеет описанную «проблему».

1 голос
/ 08 апреля 2009

Таймер будет эффективно работать в фоновом режиме и вызывать события в вашем основном потоке.

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