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.LoadSomeForm_Load(object sender, EventArgs e).

我的问题是:是否有可能UploadStatusTime_Tick之前正在处理SomeForm_Load

4

3 回答 3

4

InitializeComponent()由 Form 的构造函数调用,因此UloadStatusTimer_Tick在调用之前可能已经调用了form.Show().

如果您希望计时器在您调用后启动,请在设计器form.Show()中设置UploadStatusTimer.Enabled = false,覆盖OnShow并使用此方法设置this.UploadStatusTimer.Enabled = true

于 2012-05-10T13:22:26.720 回答
0

您要问的是“从我构建表单到触发 Load 事件的时间是否超过一秒钟?”

除了“是的,这总是可能的”的理论答案之外,它实际上归结为 (...) 在您的示例代码中花费了多长时间。一旦 Enabled 设置为 true(当它被构造时),计时器就会开始倒计时。

重要的是要注意 UI 交互是通过消息泵处理的。因此,考虑到 winforms 计时器,计时器本身在后台运行(甚至在 .net 之外;它正在使用本机 Windows 计时器),当计时器到期时,它会向您的应用程序发送一条消息,然后将一条消息排队显示“嘿,计时器滴答”的消息泵。同样的事情也适用于您的表单加载事件,它是通过消息泵上的消息触发的。因此,如果计时器在表单“加载”之前到期,那么计时器消息将在队列中的“表单加载”消息之前并首先得到处理。

如果您有兴趣了解更多信息,请参阅有关 winforms 消息泵(或某些人可能称之为消息循环)的许多文章或堆栈溢出问题。

于 2012-05-10T13:23:13.713 回答
0

To ensure that the timer does NOT go off before Form_Load, disable it in the designer and call timer.Start(); in the Form_Load event.

To ensure that it does go off before Form_Load, move the code in the timer_Tick function to a central method and call that from the constructor.

于 2012-05-10T13:24:34.160 回答