gpt4 book ai didi

c# - Application.Run(Form) 与 Form.Show()?

转载 作者:太空狗 更新时间:2023-10-29 19:56:18 24 4
gpt4 key购买 nike

假设主 GUI 线程上发生了很多事情(数据流入、用户操作等)。假设我们想创建一个表单并显示它。

如果我们使用 Application.Run(Form) 而不是 Form.Show() 是否可以提高性能?有一个更好的方法吗?请解释为什么或为什么不。

最佳答案

除非您知道它的作用,否则不要使用 Application.Run()。而且,一旦您知道它的作用,您就会知道为什么除了在程序开始时之外不应该使用它。

Application.Run 启动消息泵。这是任何 GUI 程序的核心,它使窗口能够接收消息,从而允许它触发事件和执行操作。你不能有两个消息泵,因为那没有任何意义。

(是的,我知道您可以有两个消息泵,但为什么您会想要?拥有一个一个泵已经够难的了!)

至于您的真正问题(我如何不在我的 GUI 线程上执行操作),这有点复杂。最简单的答案是“使用线程”。由于不了解你的具体情况,只能给一些大概的建议:

  1. 不要尝试从其他线程操纵控件。充其量,它不会起作用。在最坏的情况下,它会让你的房子着火(好吧,也许没那么糟糕。但是,不要这样做。)。相反,您需要 Invoke 方法。下面将提供一个示例。

  2. 不要在 GUI 线程上运行长时间运行的进程。短的事情没问题,但任何可能需要超过半秒的事情最好卸载到另一个线程。

  3. 使用事件从工作线程与 GUI 线程通信。

这是一个如何运行工作线程的例子:

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)。完成后,它会调用 WorkFinished 函数,该函数会显示结果(并清除状态)。

关于c# - Application.Run(Form) 与 Form.Show()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5200292/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com