【发布时间】:2011-05-18 22:52:02
【问题描述】:
我正在构建一个非常大的 Winforms 应用程序。一切正常,但在过去的两天里,我遇到了时间问题。例如,如果我正在运行一个打开 8 个选项卡并在每个选项卡中创建一个网络浏览器的循环,则需要一些时间。函数运行时 UI 有点无响应,但大问题不在于创建。
我有一个按钮,负责从 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();
}
还有一个问题是你是否能看到:
((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 个问题的可怕 UI 的问题。是这个吗?