0

我正在通过 c# winforms 开发一个项目。我在表单之间导航时遇到问题。

我正在使用经典的表单导航。

当我单击主表单上的按钮时,将打开一个新表单,上面有很多项目。

这是我使用的代码。

frmMuayAnaEkran frm = new frmMuayAnaEkran();
frm.ShowDialog();

所以问题是表单创建太慢了。真的,打开需要 8-10 秒。我该如何解决这个问题?这是我要打开的表单屏幕:http: //j.mp/VRMyby

4

2 回答 2

4

我想问题出在您在表单构造函数或 FormCreated 事件中执行一些昂贵的操作。也许您正在查询数据库或一些远程服务。您可能会考虑以下几点:

  • 在后台线程上执行昂贵的操作。例如,您可以使用BackgroundWorker。这不会使数据显示得更快,它只会提供更好的用户体验,因为表单会立即显示,数据会稍后显示,不会阻塞主 UI
  • 优化昂贵的操作。例如,如果您正在执行 SQL 查询,您可能希望通过 SQL 分析器查看这些查询是否可以以某种方式进行优化。令人难以置信的是,通过在某些列上放置索引可以使 SQL 查询运行得更快。如果您正在执行 HTTP 请求以获取数据,您可能会考虑是否可以减少这些请求的数量 - 通常最好发送更少的请求以通过网络返回更多数据,而不是发送许多带有小数据的请求。
  • 您可以将昂贵操作的结果缓存在内存中,以便用户下次打开相同的表单时,他不需要等待太多时间来检索这些结果。
  • 根据应用程序的架构和导航工作流程,您可以在用户实际导航到表单之前开始预加载一些数据。当然,这应该在后台线程上再次完成,以避免冻结主工作线程。
于 2012-12-31T07:30:33.027 回答
1

假设您在表单加载时有以下事情要做:

void LoadStartupItemsAndDataBlahBlah(object sender, DoWorkEventArgs e)
{
    int s = 0;
    for (int i = 0; i < 1000; i++)
        for (int j = 0; j < 1000; j++)
            for (int k = 0; k < 1000; k++)
               s++;
    MessageBox.Show(s.ToString());
}

如果您在表单加载中调用此方法

private void Form5_Load(object sender, EventArgs e)
{
    Stopwatch t = new Stopwatch();
    t.Start();
    LoadStartupItemsAndDataBlahBlah(null,null);
    t.Stop();
    this.Text = string.Format("[{0}] mili-seconds", t.ElapsedMilliseconds);
}

您的表单在大约 5 秒(5000 毫秒)后运行,并显示一个消息框1000000000

但是如果你在后台运行该方法

private void Form5_Load(object sender, EventArgs e)
{
    BackgroundWorker bg = new BackgroundWorker();
    bg.DoWork += new DoWorkEventHandler(LoadStartupItemsAndDataBlahBlah);
    Stopwatch t = new Stopwatch();
    t.Start();
    bg.RunWorkerAsync();
    t.Stop();
    this.Text = string.Format("[{0}] mili-seconds", t.ElapsedMilliseconds);
}

您的表单在大约 0-1 毫秒内加载得非常快,并且在 5 秒内消息框将到达并显示它的值1000000000

于 2012-12-31T07:50:59.973 回答