は、私は自分のアプリケーションのメッセージング側面はJabber-net(XMPP libraryを。)を使用してい私はサーバーへの接続が終了した何らかの理由で、毎分かそこらを接続しようとし続けるならば、やりたい何.NETタイマーは非同期で実行されますか?
。
次の試行の前に一定期間待つようにタイマーを開始すると、そのタイマーは非同期で実行され、結果のTickイベントがメインスレッドに参加するか、自分のスレッドを開始してタイマーを開始する必要がありますかそこに?
は、私は自分のアプリケーションのメッセージング側面はJabber-net(XMPP libraryを。)を使用してい私はサーバーへの接続が終了した何らかの理由で、毎分かそこらを接続しようとし続けるならば、やりたい何.NETタイマーは非同期で実行されますか?
。
次の試行の前に一定期間待つようにタイマーを開始すると、そのタイマーは非同期で実行され、結果のTickイベントがメインスレッドに参加するか、自分のスレッドを開始してタイマーを開始する必要がありますかそこに?
どのようなタイマーを使用していますか?
System.Windows.Forms.Timer
あなたはSynchronizingObject
System.Threading.Timer
全てにおいてスレッドプールのスレッドでそのコールバックを実行を指定しない限り、
System.Timers.Timer
は、スレッドプールのスレッドで実行されるUIスレッドで実行されますタイマー自体は非同期になり、起動するまでスレッドを「占有」しません。.NETのタイマーの実装方法がわかりませんが、Windows APIを使用してタイマーを作成すると、フォームメッセージループはWM_TIMER
というメッセージを受信し、フォームスレッドがビジーでない場合にのみ処理できますタイマーは適切なタイミングで起動しますが、UIスレッドを停止させる可能性があります。タイマーは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);
だから、これだけタイマーが記載されている "問題" があります。
System.Windows.Forms.Timerを使用していない場合は、適切なInvokeRequiredチェックと呼び出しを行わない限り、コントロールにアクセスすると例外がスローされることに注意してください。 –
あなたは正しいのですが、私の質問では、どのタイマーを使うべきかわからないと言っていたはずです。あなたが提供した3つのオプションを見ると、System.Timers.TimerはTickの場合と同様にこのケースの右のように見えます。メインスレッドで作成されたオブジェクトに呼び出しを行う必要があります。 – MrEdmundo
@MrEdmundo:「メインスレッド」とまったく同じ意味ですか? –