2009-04-08 15 views
13

は、私は自分のアプリケーションのメッセージング側面はJabber-netXMPP libraryを。)を使用してい私はサーバーへの接続が終了した何らかの理由で、毎分かそこらを接続しようとし続けるならば、やりたい何.NETタイマーは非同期で実行されますか?

次の試行の前に一定期間待つようにタイマーを開始すると、そのタイマーは非同期で実行され、結果のTickイベントがメインスレッドに参加するか、自分のスレッドを開始してタイマーを開始する必要がありますかそこに?

答えて

35

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

  • System.Windows.Forms.TimerあなたはSynchronizingObject
  • System.Threading.Timer全てにおいて

スレッドプールのスレッドでそのコールバックを実行を指定しない限り、

  • System.Timers.Timerは、スレッドプールのスレッドで実行されるUIスレッドで実行されますタイマー自体は非同期になり、起動するまでスレッドを「占有」しません。

  • +0

    System.Windows.Forms.Timerを使用していない場合は、適切なInvokeRequiredチェックと呼び出しを行わない限り、コントロールにアクセスすると例外がスローされることに注意してください。 –

    +0

    あなたは正しいのですが、私の質問では、どのタイマーを使うべきかわからないと言っていたはずです。あなたが提供した3つのオプションを見ると、System.Timers.TimerはTickの場合と同様にこのケースの右のように見えます。メインスレッドで作成されたオブジェクトに呼び出しを行う必要があります。 – MrEdmundo

    +0

    @MrEdmundo:「メインスレッド」とまったく同じ意味ですか? –

    1

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

    +0

    ありがとう、私はそれが誰かとそれを聞くために必要なケースだと思った。 – MrEdmundo

    1

    .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); 
    

    だから、これだけタイマーが記載されている "問題" があります。

    関連する問題