2

我正在维护一个较旧的 winforms 应用程序,由于数据库查询、数据网格自定义和加载大量数据,第一个窗口需要 3-5 秒才能加载。

我应该为此添加一个前屏幕,用户可以在此旧窗口和尚未实现的新功能之间进行选择。

因此,除了重构一些数据库查询和其他旧代码之外,我还想通过执行以下操作来改进此窗口的加载时间:

  1. 用户进入前屏
  2. 慢速加载窗口开始加载,就像现在一样,但在另一个线程中隐藏并在后台,而前屏幕窗口处于活动状态。如果在用户实际单击按钮打开窗口之前窗口已完全加载,那么它仍然应该是隐藏的。
  3. 如果用户单击按钮打开窗口,它将立即显示,因为它已经加载并准备就绪。

这就是我所拥有的:

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 东西不是一个选项。

最好的问候, 埃里克

4

2 回答 2

1

您是否尝试过在并行线程中创建(但不运行)慢速加载窗口,然后在需要时简单地显示该窗口?

这将在数​​据库调用和显示窗口的缓慢方面位于窗口的构造函数中的情况下起作用。

于 2012-06-21T13:47:05.710 回答
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();
    }
于 2012-06-22T08:26:49.247 回答