Таймеры .NET запускаются асинхронно?
У меня есть аспект обмена сообщениями с помощью Jabber-net (Библиотека XMPP.)
Что я хотел бы сделать, если по какой-то причине соединение с Сервером закончилось, он пытается подключиться каждую минуту или около того.
Если я запустил Таймер, чтобы подождать промежуток времени до следующей попытки, таймер запускается асинхронно, и итоговое событие Tick присоединяется к основному потоку, или мне нужно будет запустить собственный поток и запустить таймер изнутри есть?
Ответы
Ответ 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);
Таким образом, только этот таймер имеет описанную "проблему".