.NET计时器是否异步运行?

时间:2009-04-08 08:58:19

标签: c# .net multithreading timer

我使用Jabber-netXMPP library来了解我的应用程序的消息方面。)

我想做什么,如果由于某种原因与服务器的连接结束,则每隔一分钟就会继续尝试连接。

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

3 个答案:

答案 0 :(得分:35)

你使用什么样的计时器?

  • System.Windows.Forms.Timer将在UI线程中执行
  • System.Timers.Timer在线程池线程中执行,除非您指定SynchronizingObject
  • System.Threading.Timer在线程池线程中执行其回调

在所有情况下,计时器本身都是异步的 - 在它发生之前它不会“占用”一个线程。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

我不确定.NET中的Timers是如何实现的,但是如果他们使用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);

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