2014-04-30 64 views
0

我正在製作一個程序,它可以找到目錄中的重複文件,但是當它搜索的目錄中有太多這樣的文件時,它會使應用程序崩潰。 我想知道是否有辦法緩衝它抓取的文件數量。 這裏是做我解釋了事情的代碼:添加許多項目到列表框凍結UI

string[] filePathsb = Directory.GetFiles(
     @"" + Dirfind, "*" + filetyperest, SearchOption.AllDirectories); 

for (int i = 0; i < filePathsb.Length; i++) 
    { 

    ListBoxItem itm = new ListBoxItem(); 

    try 
    { 
     List<TodoItem> items = new List<TodoItem>(); 

     filelistboxitem.Items.Add(new TodoItem() { Title = "" + filePathsb[i], Deletea = "" + i }); 
    } 
    catch (Exception ex) 
    { 
     System.Windows.Forms.MessageBox.Show("Error occurance: " + ex); 
    } 

} 

剛一說明:當有大約50 <此文件正常工作。

+0

定義「崩潰應用程序」。將50個項目,甚至200個添加到列表框不應該導致問題。將數千個項目添加到列表框可能是一個問題(除了糟糕的用戶體驗外)。你會得到一個例外(細節?),程序是否鎖定,或者究竟是什麼? –

+0

我沒有得到任何異常,我認爲這是發生在我這樣做時:'string [] filePathsb = Directory.GetFiles(@「」+ Dirfind,「*」+ filetyperest,SearchOption.AllDirectories);' – andrew196

+0

因此,當我運行函數時,崩潰只會讓窗口凍結 – andrew196

回答

3

的WinForms如果添加多個項目到ListBox可能會變得非常緩慢,反應遲鈍。如果你像在你的例子中那樣從UI線程進行添加,那麼尤其如此。用戶界面將凍結,直到添加最後一個項目。

我該怎麼辦?

一個簡單的改進是調用

SuspendLayout(); 

你的循環開始前,和

ResumeLayout(); 

循環完成後。這將降低更新列表框的成本,所以整個事情完成得更快。

如何防止完全鎖定用戶界面?

您可以使用線程更新後臺列表。對於WinForms,通常使用BackgroundWorker。請注意,您不能直接從BackgroundWorker更新UI,因爲它們在不同的線程上運行。通常的事件機制ReportProgress不適用於這種情況,因爲您希望在加載所有文件之前不斷更新UI。相反,您可以使用此處列出的方法:

Accessing UI Control from BackgroundWorker Thread

+0

似乎加快了它的感謝 – andrew196

4

嘗試使用BackgroundWorker線程查找files.your UI將不會再凍結和文件中查找邏輯將在「後臺」運行