1

を使用しています。

と だけを持つようにアプリを単純化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使用率を調べましたが、メモリはそれほど使用していないようだったので、何が問題なのかわかりません.

4

2 に答える 2

2

あなたは何が起こっているのかを誤解しています。リストボックスは 5 秒後にフリーズします。これは、ユーザーが UI スレッドの通常の作業を行っていないことに気付いたときに、Windows が介入するときです。ウィンドウは、いわゆる「ゴースト ウィンドウ」に置き換えられ、緊張状態に陥り、[閉じる] ボタンをクリックしても何の効果もないことをユーザーに伝えます。

ゴースト ウィンドウが表示されたことを確認する最も簡単な方法は、タイトル バーに "応答していません" と表示されていることです。

多少うまくいくバージョン:

    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 の惨事に直面したときにも、合理的な行動を期待するべきではありません。しかし、彼らはあなたに自分自身を知らせます。

于 2013-05-20T17:54:19.467 に答える