2013-05-20 42 views
1

後,我在使用列表框掛起增加幾個條目

我簡化我的應用程序,以便它只是有一個ListBoxButton

這裏是我的按鈕單擊事件:

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使用率和內存似乎沒有使用那麼多,所以我不知道問題是什麼。

+1

爲什麼你甚至在66.000項目列表框? – Svexo

+0

我實際上並不需要那麼多人用它來測試我在一個更大的應用程序中遇到的問題,我選擇66,000,因爲我在另一個問題中看到,當超過65535個項目在列表中時,Vista有問題,無論哪種方式問題發生在它到達那麼多項目之前。 – hrh

+1

是的,你已經不知所措了。 ListBoxes真的不喜歡你這樣做。如果你真的需要添加一個項目到一個ListBox的負載,或者使用['ListBox.Items.AddRange()'](http://msdn.microsoft.com/en-us/library/system.windows.forms .listbox.objectcollection.addrange.aspx)或調用['ListBox.BeginUpdate()'](http://msdn.microsoft.com/zh-cn/library/system.windows.forms.listbox.beginupdate.aspx)之後添加項目和['ListBox.EndUpdate()'](http://msdn.microsoft.com/en-us/library/system.windows.forms.listbox.endupdate.aspx)。 –

回答

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失敗時表現出合理的表現。但他們會讓你知道自己。

+0

謝謝,for循環只是我在大型應用程序中遇到的一個測試案例,在我的大型應用程序中它稍微複雜一些,然後一次添加一堆行,但是隨着任務完成,它們會相當頻繁地添加,我會然而嘗試開始和結束更新。 =) – hrh

2

你添加一個項目,它佔用內存變大了,每次,而且由於項目是在動態列表,該程序可能要重新分配空間。

添加到您很可能使用該應用程序只有一個線程(你不使用後臺工作線程更新列表,對吧?),你知道爲什麼你的應用程序掛起的事實。 Windows窗體總是需要一段時間才能更新控件......這只是對於正常的日常使用而言,他們需要花費更多的時間進行更新。對於像在GUI中包含超過幾百個項目的列表那樣的神祕用途,它們將需要幾秒或幾分鐘才能刷新,並且您會將其視爲懸掛。將項目處理放在另一個線程中,你會發現表單會更新它的GUI,但是在更新之間需要很長時間。

+0

那麼我會不會在資源監視器中看到內存已經用完?它似乎沒有被用完。 – hrh

+0

如果您取消分配10 MB並分配10MB和1個字節,則不會在顯示器中看到太多變化。 – Renan

+1

雖然它是線程安全的,你可以使用backgroundwork更新嗎? – Svexo