Подтвердить что ты не робот

Таймеры .NET запускаются асинхронно?

У меня есть аспект обмена сообщениями с помощью Jabber-net (Библиотека XMPP.)

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

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

Таким образом, только этот таймер имеет описанную "проблему".