2009-04-08 4 views
13

У меня есть обмен сообщениями аспект моего приложения с помощью Jabber-net (XMPP library.)Выполняют ли таймеры .NET таймер?

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

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

ответ

35

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

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

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

+0

Помните, если вы не используете System.Windows.Forms.Timer, который обращается к элементу управления, генерирует исключение, если вы не выполните соответствующую проверку и вызов InvokeRequired. –

+0

Вы правы. В моем вопросе я должен был сказать, что не был уверен, какой таймер я должен использовать. Рассматривая три варианта, которые вы предоставили и читаете MSDN, System.Timers.Timer выглядит как подходящий для этого случая, так как по Tick будет необходимо создать вызов для объекта, созданного в основном потоке. – MrEdmundo

+0

@MrEdmundo: Что именно вы подразумеваете под «основной нитью»? –

1

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

+0

Спасибо, я подумал, что это так, просто нужно прозвучать с кем-то. – MrEdmundo

1

Я не уверен, как реализованы таймеры в .NET, но если они используют 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); 

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

Смежные вопросы