web-dev-qa-db-ja.com

System.Windows.Forms.TimerはUIとは異なるスレッドで実行されますか?

UpdateStatus()という名前の関数を毎分実行するタイマーを作成および設定するフォームオブジェクトを作成するメインスレッドがあります。ただし、updateStatus()は、メインスレッドによっていくつかの場所で呼び出されます。

ただし、同期の問題が発生するかどうかはわかりません。 C#のSystem.Windows.Forms.Timerは、メインスレッド以外の別のスレッドで実行されますか?

23
user186246

いいえ、タイマーイベントはUIスレッドで発生します。

同期性の問題は発生しません。これは、WinFormsアプリケーションで使用するタイマーコントロールの正しいバージョンです。それはあなたが求めていることをするために特別に設計されています。これは、標準の Windowsタイマー を使用して内部で実装されています。

documentation は、備考セクションでこれを確認します。

タイマーは、ユーザー定義の間隔でイベントを発生させるために使用されます。このWindowsタイマーは、UIスレッドを使用して処理を実行するシングルスレッド環境向けに設計されています。ユーザーコードでUIメッセージポンプを使用でき、常に同じスレッドから操作するか、呼び出しを別のスレッドにマーシャリングする必要があります。

このタイマーを使用する場合は、Tickイベントを使用して、ポーリング操作を実行するか、指定した期間スプラッシュ画面を表示します。 Enabledプロパティがtrueに設定され、Intervalプロパティがゼロより大きい場合は常に、Intervalプロパティの設定に基づいてTickイベントが間隔を置いて発生します。

25
Cody Gray

いいえ、タイマーのTickイベントは、WM_TIMERメッセージを受信すると、メッセージループによってUIスレッドから発生します。 UIスレッドがアイドル状態のときにのみ実行できます。

9
Hans Passant

番号。

Windows.Formsタイマーの要点は、GUIスレッドで実行されることです。

Windows(WinForms)はMessagePump(Application.Run()を参照)と呼ばれるものを実行し、これがタイマーを可能にするものです。

すべてのコードは何らかの形でEventhandlerの一部として実行され、タイマーティックが他のイベントハンドラーを「中断」することはありません。

6
Henk Holterman

Windows.Formsタイマーは、おそらくsync-contextを介して、UIスレッドでイベントを発生させます。

UI以外のスレッドが必要な場合は、他のタイマーがあります。たとえば、System.Timers.TimerやSystem.Threading.Timerなどです。

5
Marc Gravell

documentation によると、メインUIスレッドで実行されます。

タイマーは、ユーザー定義の間隔でイベントを発生させるために使用されます。このWindowsタイマーは、UIスレッドを使用して処理を実行するシングルスレッド環境向けに設計されています。ユーザーコードでUIメッセージポンプを使用でき、常に同じスレッドから操作するか、呼び出しを別のスレッドにマーシャリングする必要があります。

2
Darin Dimitrov