2012-12-31 43 views
0

我正在通过c#winforms开发一个项目。 我有一个导航到表单之间的问题。立即在winforms中导航窗体

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

当我点击主窗体上的一个按钮时,会打开一个新窗体,其上有很多项目。

这里是我使用的代码。

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

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

+0

你打开这个表格每个应用程序运行一次?或者你想多次打开它? –

回答

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

+0

您好我使用BackgroundWorker,但现在表单无法通过对话框打开。我使用Showdialog(),但像Show()一样打开。 – TheMuyu

+0

@ TheMuyu让我检查一下,BRB在几分钟内。 –

+0

确定配偶。还当我关闭主窗体仍然运行的形式:) – TheMuyu

4

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

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