在winforms中立即导航表单

本文关键字:导航 表单 winforms | 更新日期: 2023-09-27 17:50:17

我正在通过c# winforms开发一个项目。我有一个问题,导航到之间的形式。

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

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

这里是我使用的代码。

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

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

在winforms中立即导航表单

我猜这个问题来自于这样一个事实,即您正在表单构造函数内或FormCreated事件内执行一些昂贵的操作。也许您正在查询数据库或一些远程服务。您可以考虑以下几点:

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

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

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());
}

如果你在form load

中调用这个方法
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