在后台加载窗口,直到告诉它显示

时间:2012-06-21 13:41:10

标签: c# winforms multithreading

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

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

所以,除了重构一些db查询和其他旧代码之外,我想通过这样做来改善这个窗口的加载时间:

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

    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

2 个答案:

答案 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();
    }