2012-10-29 42 views
0

我使用的是.NET 4.0和VS2010。用戶界面變得更慢,甚至長時間運行時崩潰

我的程序是一個簡單的多線程獲取請求發送器,它更新一個bindingList並通過DataGridView顯示列表。 datagridview處於虛擬模式。此外,我使用一個文本框和狀態欄來顯示請求的狀態,一個請求通常會將4-5行添加到文本框中,並更改狀態欄中的數字。

工作負載保持不變,每兩秒一次請求。請求很快,大部分時間只有一個請求突出。新請求線程由最後一箇舊請求線程調用。使用begininvoke和delegate,UI每次線程更新幾次。

MyInvoke mi = new MyInvoke(change); 
this.BeginInvoke(mi, new Object[] { true, "Row " + pos + " standing by...", (pos + 1),0 }); 

我在datagridview上顯示整個3000個請求,開始時內存使用量爲30MB。當2XXX請求達到內存使用4XMB時,我可以看到狀態欄編號和文本框更新更慢。例如,2000-> 2001-> 2002-> 2003變爲2000-> 2003。

如果我選擇應用程序窗口,有時整個UI甚至會凍結。我的datagridview固定在虛擬模式的幾行上。我相信這是UI線程的問題。當它凍結時,我可以等到所有請求都完成並且一切都變得平穩。

有關發生了什麼的任何想法?

+1

在這裏你去:HTTP: //stackoverflow.com/questions/12308503/is-it-thread-safe-to-read-a-form-controls-value-but-not-change-it-without-usin –

+0

也許這是由於過度使用begininvoke , 我會試一下。但任何人都可以解釋爲什麼這隻發生在2XXX行之後?大部分時間消息的數量是相同的。一個愚蠢的問題是,是否有可能使窗體對象在不同的​​線程中,這樣整個窗體就不會凍結? –

+1

Nah **不要將窗體對象放在不同的線程中,這是問題的一部分。 GUI不是線程安全的。根據MVP Peter Richie寫的上面的鏈接,保留更新GUI主窗口的調用:'必須在其消息泵正在運行的線程上訪問Windows控件。「 –

回答

0

最後,我想出了它爲什麼如此緩慢。像我這樣的Noob可能很容易造成這種錯誤。 我在線程中使用的大量begininvoke會影響,但它不足以凍結UI線程。

繁重的工作量主要是由下面的代碼買它每次分配整個文本到文本框中

textbox1.Text += "string" 

下面的代碼可以解決這個問題

textbox1.AppendText("string")