2009-04-08 76 views
13

我有使用Jabber-net(一XMPP library。)我的应用程序的消息方面.NET定时器是否异步运行?

我想这样做,如果由于某种原因与服务器的连接结束,是继续努力,以每分钟左右连接。

如果我在下一次尝试之前启动一个Timer等待一段时间,该计时器是否异步运行,并且生成的Tick事件是否加入主线程,或者是否需要启动我自己的线程并启动计时器在那里?

回答

35

你使用什么样的计时器?

  • System.Windows.Forms.Timer将在UI线程
  • System.Timers.Timer执行一个线程池线程,除非你指定一个SynchronizingObject
  • System.Threading.Timer执行一个线程池线程

在所有执行其回调情况下,计时器本身将是异步的 - 它不会“占用”一个线程,直到它触发。

+0

请记住,如果您没有使用System.Windows.Forms.Timer,那么除非您执行了适当的InvokeRequired检查和调用,否则访问Control的控件将引发异常。 – 2009-04-08 09:14:50

1

计时器将在后台有效运行并导致主线程中的事件被执行。

+0

谢谢,我以为是这样,只是需要与某人发声。 – MrEdmundo 2009-04-08 09:06:35

1

我不确定.NET中的定时器是如何实现的,但是如果他们使用Windows API创建定时器,则表单消息循环会收到WM_TIMER消息,并且只有当表单线程不忙时才能处理请求,所以计时器会在正确的时间触发,但是你可能会拖延UI线程。定时器将以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); 

所以只有这个计时器具有所述的 “问题”。