Windows表单需要时间来响应

时间:2011-04-05 20:50:37

标签: c# winforms

我正在构建一个非常大的Winforms应用程序。一切都很好,但在过去的两天里,我遇到了很多问题。例如,如果我运行的循环打开8个选项卡并在每个选项卡中创建一个webbrowser,则需要一些时间。在功能运行时,用户界面没有反应,但最大的问题不在于创建。

我有一个按钮,负责从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();

这应该从主面板中删除三个面板,但它不起作用。我不知道为什么,但只有在运行下面的两个循环之后它才会移除面板,只有一个循环是不够的。 非常感谢提前:))

1 个答案:

答案 0 :(得分:0)

您是否有理由没有参考该面板中存在的帮助面板或您要处置的其他3个控件?迭代GUI中的控件列表(你说你有很多标签和控件)来寻找这3个特定控件似乎效率很低。至少,您应该缓存helpPanel搜索的结果,因为接下来的两行重复刚刚发生的相同搜索过程。可以使用相同的解决方案解决以下循环。

等等,这两个循环正在迭代helpPanel.Controls。那么你已经有了对helpPanel的引用,并且在之前的步骤中没有使用它?