2011-04-05 79 views
0

我正在構建一個非常大的Winforms應用程序。一切正常,但在過去的兩天裏,我遇到了與時俱進的問題。例如,如果我正在運行一個可打開8個選項卡並在每個選項卡中創建一個webbrowser的循環,則需要一些時間。 UI在功能運行時沒有響應,但是最大的問題不在於創建。Windows窗體需要時間來響應

我有一個按鈕,負責從UI中刪除所有我不需要的東西(即將其重置爲正常狀態)。打開大約10個選項卡時,只需要很長時間。我測量了代碼執行所需的時間和時間大約爲1-1.2秒,但UI所需的響應時間和預處理所做的一切還需要大約10秒鐘的時間。 這裏是一個代碼示例:

private void killGUI() 
{ 
    DateTime a = DateTime.Now; 
    TimeSpan b; 
    this.SuspendLayout(); 
    //tabPages.RemoveAll(TabPage); 
    tabPages.Clear(); 
    if (tabControl1.TabPages.Count > 1) 
    { 
     //MessageBox.Show("" + tabControl1.TabPages.Count); 
     //DateTime a = DateTime.Now; 
     /*while (tabControl1.TabPages.Count != 1) 
     { 
      //int i = 1; 
      foreach (TabPage tab in tabControl1.TabPages) 
      { 
       if (tab.Name != "helpPanel") 
       { 
        tabControl1.TabPages.Remove(tab); 
        tab.Dispose(); 
       } 

      } 
     }*/ 
     while (tabControl1.TabPages.Count > 1) 
     { 
     Application.DoEvents(); 
     TabPage t = tabControl1.TabPages[1]; 
     tabControl1.TabPages.RemoveAt(1); 
     t.Dispose(); 
     } 
     //TimeSpan v = DateTime.Now.Subtract(a); 
     //MessageBox.Show(""+v.Milliseconds); 
    } 
    /////// 
    b = DateTime.Now.Subtract(a); 
    MessageBox.Show("REMOVING ALL TABS:" + a.Millisecond); 
    a = DateTime.Now; 
    //////// 
    questions.ElementAt(0).richy.Dispose(); 
    questions.ElementAt(0).createNewCom.Dispose(); 
    //questions.ElementAt(questions.Count - 1).Name.Dispose(); 
    for (int i = 0; i < questions.ElementAt(questions.Count - 1).comments.Count; i++) 
    { 
    Application.DoEvents(); 
    if (questions.ElementAt(0).comments.ElementAt(i).texty != null) 
     questions.ElementAt(0).comments.ElementAt(i).texty.Dispose(); 
    if (questions.ElementAt(0).comments.ElementAt(i).cButton != null) 
     questions.ElementAt(0).comments.ElementAt(i).cButton.Dispose(); 
    Application.DoEvents(); 
    } 
    ///// 
    b = DateTime.Now.Subtract(a); 
    MessageBox.Show("REMOVING THIS QUESTION:" + a.Millisecond); 
    a = DateTime.Now; 
    ///// 
    panel1.Visible = false; 
    while (panel2.Controls.Count != 0) 
    { 
    Application.DoEvents(); 
    panel2.Controls.RemoveAt(0); 
    } 

    panel2.Visible = false; 
    backButton.Visible = false; 
    forwardButton.Visible = false; 
    //placePanel.Dispose(); 
    //urgencyPanel.Dispose(); 
    //categoriesPanel.Controls.Clear(); 
    //categoriesPanel.Dispose(); 
    //((Panel)((TabPage)tabControl1.Controls.Find("helpPanel", false)[0]).Controls.Find("placePanel", false)[0]).Dispose(); 
    ((Panel)((TabPage)tabControl1.Controls.Find("helpPanel", false)[0]).Controls.Find("categoriesPanel", false)[0]).Dispose(); 
    ((Panel)((TabPage)tabControl1.Controls.Find("helpPanel", false)[0]).Controls.Find("urgencyPanel", false)[0]).Dispose(); 
    ((Panel)((TabPage)tabControl1.Controls.Find("helpPanel", false)[0]).Controls.Find("placePanel", false)[0]).Dispose(); 

    //Controls[] con=tabControl1.Controls.Find("HelpPanel",false); 
    newQuestionTextBox.Clear(); 
    browsers.Clear(); 
    panels.Clear(); 
    buttons.Clear(); 
    questions.RemoveAt(0); 
    finalTuid = ""; 
    this.ResumeLayout(); 
    foreach (Control cl in helpPanel.Controls) 
    { 
    Application.DoEvents(); 
    if (cl.Name == "categoriesPanel" || cl.Name == "urgencyPanel" || cl.Name == "placePanel") 
    { 
     //WTF that shouldnt happen-i cant get this. 
     //MessageBox.Show("!!!"); 
     cl.Dispose(); 
    } 
    } 
    foreach (Control cl in helpPanel.Controls) 
    { 
    Application.DoEvents(); 
    if (cl.Name == "categoriesPanel" || cl.Name == "urgencyPanel" || cl.Name == "placePanel") 
    { 
     //FFFFFFFFFFFUUUUUUUUUUUUUUUUUUU 
     //MessageBox.Show("!!!!!!!!"); 
     cl.Dispose(); 
    } 
    } 
    ///// 
    b = DateTime.Now.Subtract(a); 
    MessageBox.Show("ALL ELSE:" + a.Millisecond); 
    /////// 
    this.ResumeLayout(); 
} 

也是另一個萬阿英,蔣達清是如果u可以看到:

((Panel)((TabPage)tabControl1.Controls.Find("helpPanel", false)[0]).Controls.Find("categoriesPanel", false)[0]).Dispose(); 
((Panel)((TabPage)tabControl1.Controls.Find("helpPanel", false)[0]).Controls.Find("urgencyPanel", false)[0]).Dispose(); 
((Panel)((TabPage)tabControl1.Controls.Find("helpPanel", false)[0]).Controls.Find("placePanel", false)[0]).Dispose(); 

這應該從主面板中刪除三個面板,但它只是不工作。我不知道爲什麼,但是隻有在運行下面的兩個循環之後,才能移除面板,只有一個循環是不夠的。 非常感謝:)

+1

本週早些時候,我們提出了一個關於具有1500個問題的怪異用戶界面的問題。是這個嗎? – 2011-04-05 21:16:47

回答

0

是否有一個原因,您沒有參考該面板中存在的幫助面板或其他3個想要處置的控件?看起來效率非常低,不得不遍歷GUI中的控件列表(您說有很多選項卡控件)尋找這3個特定的控件。至少,您應該緩存helpPanel搜索的結果,因爲接下來的兩行重複剛發生的相同搜索過程。以下循環可以用相同的解決方案解決。

等等,這兩個循環遍歷helpPanel.Controls。所以你已經有了一個參考helpPanel,只是沒有在前面的步驟中使用它?

+0

我有一個參考我想要處理的所有面板(即categoriesPanel,urgencyPanel,placePanel),但當我使用例如'code' placePanel.Dispose(); '代碼'它出於某種原因不會處置它 - realy - 只有在它處理它的兩個循環後。我的主要問題是,在測試代碼運行約1秒的時間之後 - 但直到用戶界面執行了我想要的操作,需要十秒鐘,我無法得到原因。 – 2011-04-05 21:42:30

相關問題