我有使用Jabber-net(一XMPP library。)我的應用程序的消息方面.NET定時器是否異步運行?
我想這樣做,如果由於某種原因與服務器的連接結束,是繼續努力,以每分鐘左右連接。
如果我在下一次嘗試之前啓動一個Timer等待一段時間,該計時器是否異步運行,並且生成的Tick事件是否加入主線程,或者是否需要啓動我自己的線程並啓動計時器在那裏?
我有使用Jabber-net(一XMPP library。)我的應用程序的消息方面.NET定時器是否異步運行?
我想這樣做,如果由於某種原因與服務器的連接結束,是繼續努力,以每分鐘左右連接。
如果我在下一次嘗試之前啓動一個Timer等待一段時間,該計時器是否異步運行,並且生成的Tick事件是否加入主線程,或者是否需要啓動我自己的線程並啓動計時器在那裏?
你使用什麼樣的計時器?
System.Windows.Forms.Timer
將在UI線程System.Timers.Timer
執行一個線程池線程,除非你指定一個SynchronizingObject
System.Threading.Timer
執行一個線程池線程在所有執行其回調情況下,計時器本身將是異步的 - 它不會「佔用」一個線程,直到它觸發。
我不確定.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);
所以只有這個計時器具有所述的 「問題」。
請記住,如果您沒有使用System.Windows.Forms.Timer,那麼除非您執行了適當的InvokeRequired檢查和調用,否則訪問Control的控件將引發異常。 – 2009-04-08 09:14:50