【问题标题】:Windows form takes time to respondWindows 窗体需要时间来响应
【发布时间】: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 的问题。是这个吗?

标签: c# winforms


【解决方案1】:

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

等等,这两个循环正在迭代helpPanel.Controls。所以您已经有了对 helpPanel 的引用,只是没有在前面的步骤中使用它?

【讨论】:

  • 我引用了我想要处理的所有面板(即 categoriesPanel、urgencyPanel、placePanel),但是当我使用例如 codeplacePanel.Dispose(); code 出于某种原因,它不会真正处置它——只有在它处置它的两个循环之后。我的主要问题是,在测试了代码运行大约需要 1 秒的时间之后 - 但是直到用户界面执行我想要的操作之前,它需要 10 秒,我不明白为什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-10
  • 2011-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多