1

I'm using in .

I simplified my app so that it just has a ListBox and a Button.

Here is my button click event:

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;
    }
}

When I run my app and push the button I see the ListBox updating and after a while (it varies entry 3041 or so) the program will appear to hang as it adds the rest of the entries once its done, the ListBox will appropriately refresh.

Why the hang? Is it just too much to handle? I looked at my cpu usage and memory didn't seem to be using that much so I'm not sure what the problem is.

4

2 回答 2

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;
    }

当你做不合理的事情时,你不应该期望 windows 表现得合理。而且你也不应该期望用户在面对这种 UI 灾难时表现得合理。但他们会让你知道他们自己。

于 2013-05-20T17:54:19.467 回答
2

每次添加项目时,它占用的内存都会变大,并且由于项目位于动态列表中,程序可能必须重新分配空间。

除此之外,您可能在该应用程序中只使用了一个线程(您没有使用后台工作线程来更新列表,对吗?),您就会明白为什么您的应用程序会挂起。Windows 窗体在必须更新其控件时总是需要一段时间......这只是对于正常的日常使用,它们需要几毫秒才能更新。对于像 GUI 中包含数百个项目的列表这样的神秘用途,刷新它们需要几秒钟或几分钟,您会觉得这是挂起的。将项目处理放在另一个线程中,您会看到表单将很快更新它的 GUI,但更新之间需要很长时间。

于 2013-05-20T17:04:00.803 回答