在winforms中立即导航表单
本文关键字:导航 表单 winforms | 更新日期: 2023-09-27 17:50:17
我正在通过c# winforms开发一个项目。我有一个问题,导航到之间的形式。
我正在使用经典的表单导航。
当我点击主表单上的一个按钮时,会打开一个新表单,里面有很多项目。
这里是我使用的代码。
frmMuayAnaEkran frm = new frmMuayAnaEkran();
frm.ShowDialog();
所以问题是表单创建太慢了。真的,打开需要8-10秒。我该如何解决这个问题?这是我要打开的表单屏幕:http://j.mp/VRMyby
我猜这个问题来自于这样一个事实,即您正在表单构造函数内或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