2011-02-10 9 views
0

タイマーの仕組みを考えていましたが、私が完全に理解していないことがあります。
Timerは、時間が経過すると呼び出されるイベントを使用します。これは、クロックを制御する(またはクロックによって制御される)OSイベントによって引き起こされると想定しています。
しかし、どのスレッドがそのイベントを捕捉するのかは分かりません。タイマーのコールバックスレッド

オブジェクトには独自のスレッドがありますか?
イベントは、タイマーオブジェクトを作成したスレッドで呼び出されますか?

EDIT:

そしてSystem.Timers.TimerSystem.Windows.Forms.Timer間の側面に差がありますか?

答えて

9

Timerに依存します。 System.Windows.Forms.Timerを使用すると、ティックイベントはUIスレッドで処理されます。 System.Threading.TimerSystem.Timers.Timerのデフォルトでは、スレッドプールスレッドです。ただし、後者の場合は、SynchronizingObjectを指定して、ハンドラを適切なスレッドにマーシャリングすることができます。

+1

ちょうどブートに追加する:前者の場合は、 'state'オブジェクトをシンクオブジェクトとして指定するだけです。 .NET 4は 'WPF 'の' ISynchronizeInvoke'とは異なり 'Dispatcher'を使いますが、これはまったく同じ方法で使うことができますが、前述の方法で' System.Timers.Timer'と一緒に使うことはできません。 –

+0

スレッドプールを使用する場合、次のトリガーは別のスレッドにありますか?以前は同じスレッドだったのでしょうか?繰り返しますが、タイマーには専用のスレッドがありますか? –

+0

@Yochai:毎回別のスレッドで発生する可能性があります(もちろん、同じものを再利用することもできます)。私はスレッドがタイマーのために "予約されている"とは思わない。 –