2009-04-08 73 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); 

所以只有這個計時器具有所述的 「問題」。