假设主GUI线程上有很多事情正在发生(数据流入,用户操作等)。假设我们想创建一个表单并显示它。
如果我们使用
如果我们使用
Application.Run(Form)
而不是Form.Show()
,是否可以提高性能?是否有更好的方法来实现这一点?请解释原因。Application.Run(Form)
而不是Form.Show()
,是否可以提高性能?是否有更好的方法来实现这一点?请解释原因。Application.Run()
的作用,否则不要使用它。一旦你知道它的作用,你就会知道为什么只有在程序开头才能使用它。
Application.Run
启动一个消息泵。这是任何GUI程序的核心,它使窗口接收消息,从而触发事件并执行操作。您不能有两个消息泵,因为这没有任何意义。Invoke
方法。下面将提供一个示例。delegate void VoidDelegate();
List<int> results;
bool cancelWork = false;
void DoWork() {
int calc;
results = new List<int>();
for(int i = int.MinValue ; i < int.MaxValue; i+=10) {
if(cancelWork) break;
results.Add(i);
}
this.Invoke(new VoidDelegate(WorkFinished));
}
void Button1_Click(object sender, EventArgs e) {
button1.Enabled = false;
button2.Enabled = true;
cancelWork = false;
Thread t = new Thread(DoWork);
t.Start();
}
void Button2_Click(object sender, EventArgs e) {
button2.Enabled = false;
cancelWork = true;
}
void WorkFinished() {
button1.Enabled = true;
button2.Enabled = false;
textBox1.Text = results.Count.ToString();
}
button1
(“运行”)和button2
(“取消”),以及一个文本框textbox1
。在开始时,button2应该是禁用状态(Enabled = false
)。button2
)。一旦完成,它会Invoke
WorkFinished
函数,该函数显示结果(并清除状态)。Application.Run(myForm)
行之后处理myForm
吗?就像SolarLint建议的那样。 - Yousha AleayoubApplication.Run()
初始化主消息循环,并且在应用程序启动时只应调用一次。在应用程序生命周期中显示的所有其他表单都应为Form.Show
或等效形式。Application.Run
,但是那么您将需要同步两个UI线程。您不能仅仅传递东西而不确保您不会进入争用情况。