我正在维护一个较旧的winforms应用程序,其中第一个窗口由于数据库查询,数据网格自定义和加载大量数据而需要3-5秒才能加载。
我应该添加一个前面的屏幕,用户可以在这个旧窗口和尚未实现的新功能之间进行选择。
所以,除了重构一些db查询和其他旧代码之外,我想通过这样做来改善这个窗口的加载时间:
这就是我所拥有的:
private void startBackgroundLoading()
{
var myThread = new Thread(openSlowLoadingWindow);
myThread.SetApartmentState(ApartmentState.STA);
myThread.Start();
}
private void openSlowLoadingWindow()
{
System.Windowns.Forms.Application.Run(new SlowWindow());
}
我正在使用Application.Run(),因为上面说明的两个窗口(前端屏幕和慢速加载)都在不同的项目中。
显然上面的代码会启动新线程,并在完成加载时向我显示窗口,但如上所述,我想告诉它何时实际显示。
我尝试了几种方法在后台运行新线程,隐藏窗口和其他各种东西。
我对编程比较陌生,所以如果我从完全错误的角度攻击这个,请告诉我如何改进。
我已经绑定.net 4.0所以新的async / await东西不是一个选项。
最好的问候,Eric
答案 0 :(得分:1)
您是否尝试在并行线程中创建(但未运行)慢速加载窗口,然后只在需要时显示此窗口?
这将适用于数据库调用和显示窗口的慢速方面位于窗口构造函数中的场景。
答案 1 :(得分:0)
您可以尝试将此事件处理程序添加到慢速表单中:
private void SlowWindow_Shown(object sender, EventArgs e)
{
Hide();
}
并添加此方法以从前面屏幕调用:
public void ShowCrossThread()
{
this.Invoke(new Action(() => { Show(); }));
}
然后在前面的屏幕中,您需要执行以下操作:
SlowForm _slowForm;
private void openSlowLoadingWindow()
{
_slowForm = new SlowForm();
System.Windows.Forms.Application.Run(_slowForm);
}
private void btnSlowForm_Click(object sender, EventArgs e)
{
_slowForm.ShowFromThread();
Hide();
}