在winforms中立即导航表单

时间:2012-12-31 07:25:53

标签: c# winforms

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

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

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

这是我使用的代码。

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

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

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分: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