13


8

私は Jabber-net(http://en.wikipedia.org/wiki/List_of_XMPP_library_software[XMPPライブラリ]を使用して私のアプリケーションのメッセージングの側面を持っています。 )

何らかの理由でサーバーへの接続が終了した場合、私がやりたいことは1分ごとに接続を試みることです。

次回の試行の前にTimerを起動して一定時間待つ場合、そのTimerは非同期的に実行され、結果のTickイベントはメインスレッドに参加しますか。それとも、自分のスレッドを起動してそこからタイマーを起動する必要がありますか

3 Answer


35


どのようなタイマーを使っていますか?

  • `+ System.Windows.Forms.Timer +`はUIスレッドで実行されます

  • `+ System.Timers.Timer `は、以下の場合を除き、スレッドプールスレッドで実行されます。 ` SynchronizingObject +`を指定します

  • `+ System.Threading.Timer +`はスレッドプールでコールバックを実行します 糸

すべての場合において、タイマー自体は非同期になります - 起動するまでスレッドを「占有する」ことはありません。


1


タイマーは効果的にバックグラウンドで実行され、メインスレッドのイベントが実行されるようにします。


1


NETのTimerの実装方法はわかりませんが、タイマーの作成にWindows APIを使用する場合、フォームメッセージループはhttp://msdn.microsoft.com/en-us/library/ms644902(VS .85).aspx [+ WM_TIMER +]メッセージ。フォームスレッドがビジーでない場合にのみ要求を処理できるため、タイマーは適切なタイミングで起動しますが、UIスレッドを停止する可能性があります。 タイマーはhttp://msdn.microsoft.com/en-us/library/ms644906(VS.85).aspx [+ SetTimer +] APIで開始され、OSは必ず `+ 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);

したがって、このタイマーだけが「問題」を記述しています。