我正在構建一個非常大的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();
這應該從主面板中刪除三個面板,但它只是不工作。我不知道爲什麼,但是隻有在運行下面的兩個循環之後,才能移除面板,只有一個循環是不夠的。 非常感謝:)
本週早些時候,我們提出了一個關於具有1500個問題的怪異用戶界面的問題。是這個嗎? – 2011-04-05 21:16:47