1

UI スレッドには、次のようなコードがあります。

SomeForm form = new SomeForm();
(...)
form.Show();

SomeForm クラスには特に、次のようなSystem.Windows.Forms.Timer自動生成コードによって初期化されるメンバーとしてインスタンスがあります。InitializeComponent()

this.UploadStatusTimer.Enabled = true;
this.UploadStatusTimer.Interval = 1000;
this.UploadStatusTimer.Tick += new System.EventHandler(this.UploadStatusTimer_Tick);

form.Show()最後に、Form.Loadによって処理されているイベントを発生させSomeForm_Load(object sender, EventArgs e)ます。

私の質問は:UploadStatusTime_Tick以前に処理されていた可能性はありSomeForm_Loadますか?

4

3 に答える 3

4

InitializeComponent()は Form のコンストラクターによって呼び出されるため、UloadStatusTimer_Tickを呼び出す前に が既に呼び出されている可能性がありますform.Show()

を呼び出した後にタイマーを開始する場合は、デザイナーでform.Show()設定し、このメソッドをオーバーライドして使用して を設定します。UploadStatusTimer.Enabled = falseOnShowthis.UploadStatusTimer.Enabled = true

于 2012-05-10T13:22:26.720 に答える
0

タイマーが前にオフにならないようにForm_Loadするには、デザイナでタイマーを無効にしてtimer.Start();Form_Loadイベントを呼び出します。

の前に確実に実行されるようForm_Loadにするには、関数内のコードをtimer_Tick中央のメソッドに移動し、コンストラクターから呼び出します。

于 2012-05-10T13:24:34.160 に答える
0

あなたが求めているのは、「フォームを作成してから Load イベントが発生するまでに 1 秒以上かかることはありますか?」ということです。

「はい、これは常に可能です」という理論的な答えを超えて、実際にはサンプルコードにかかる時間 (...) にかかっています。タイマーは、Enabled が true に設定されるとすぐにカウントダウンを開始します (作成時)。

UI インタラクションはメッセージ ポンプを介して処理されることに注意してください。したがって、winformsタイマーについて考えると、タイマー自体はバックグラウンドで実行されておらず(.netの外部でも、ネイティブWindowsタイマーを使用しています)、タイマーが期限切れになると、アプリケーションにメッセージが送信され、メッセージがキューに入れられます「おい、タイマーティックが発生した」というメッセージポンプ。フォームの読み込みイベントにも同じことが当てはまります。メッセージ ポンプのメッセージを介してトリガーされます。そのため、フォームが「ロード」される前にタイマーが切れると、タイマー メッセージはキューの「フォーム ロード」メッセージの前に置かれ、最初に処理されます。

詳細を知りたい場合は、winforms メッセージ ポンプ (またはメッセージ ループと呼ぶ人もいます) に関する多くの記事やスタック オーバーフローの質問があります。

于 2012-05-10T13:23:13.713 に答える