我简化了我的应用,只有ListBox
和Button
。
这是我的按钮点击事件:
private void button1_Click(object sender, EventArgs e)
{
for (long i = 0; i < 66000; i++)
{
listBox1.Items.Add(i.ToString());
listBox1.SelectedIndex = listBox1.Items.Count - 1;
}
}
当我运行我的应用程序并按下按钮时,我看到ListBox
更新,过了一会儿(它会改变条目3041左右),程序将会挂起,因为它会在完成后添加其余条目,ListBox
将适当刷新。
为什么挂?它处理得太多了吗?我查看了我的cpu使用情况,内存似乎没有使用那么多,所以我不确定是什么问题。
答案 0 :(得分:2)
每次添加项目时,所占用的内存都会变大,并且由于项目位于动态列表中,因此程序可能需要重新分配空间。
除此之外,您可能只在该应用中使用了一个线程(您没有使用后台工作线程来更新列表,对吧?),您就会明白为什么您的应用会挂起。 Windows窗体在需要更新控件时总是需要一段时间......对于正常的日常使用,它们需要几毫秒才能更新。对于包含GUI中包含数百个项目的列表的晦涩用途,它们需要花费数秒或数分钟来刷新,并且您将其视为悬挂。将项目处理放在另一个线程中,您将看到该表单将很快更新它的GUI,但在更新之间需要很长时间。
答案 1 :(得分:2)
你误解了发生了什么。您的列表框将在5秒后冻结。当Windows注意到你没有处理UI线程的正常职责时,就会介入。你的窗口被所谓的“幽灵窗口”替换告诉用户你已经精神紧张,并且点击关闭按钮之类的事情不会产生任何影响。
告诉你有鬼窗口的最简单方法是从标题栏开始,它说“没有回复”。
它的版本会更好一些:
private void button1_Click(object sender, EventArgs e) {
listBox1.BeginUpdate();
for (long i = 0; i < 66000; i++) {
listBox1.Items.Add(i.ToString());
}
listBox1.EndUpdate();
listBox1.SelectedIndex = listBox1.Items.Count - 1;
}
当你做不合理的事情时,你不应该期望窗户表现得合理。并且您不应期望用户在遇到此UI灾难时表现得合理。但他们会告诉你自己。