c# - 在后台加载一个窗口,直到告诉它显示

标签 c# winforms multithreading

我正在维护一个较旧的 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() 是因为上面说明的两个窗口(前屏幕和缓慢加载)在不同的项目中。

显然,上面的代码将启动新线程并在完成加载后向我显示窗口,但如上所述,我想告诉它何时实际显示自己。

我尝试了几种方法来在后台运行新线程、隐藏窗口和其他各种东西。

我是编程新手,所以如果我从完全错误的角度来解决这个问题,请告诉我如何改进。

我绑定(bind)到 .net 4.0,所以新的 async/await 东西不是一个选项。

最好的问候,埃里克

最佳答案

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

这将适用于数据库调用和显示窗口的缓慢方面在窗口的构造函数中的场景。

关于c# - 在后台加载一个窗口,直到告诉它显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11139520/

相关文章:

c# - RestSharp 忽略响应字符集编码

c# - 当前上下文中不存在变量

c# - 您可以从 Windows 窗体应用程序公开 XML 网络服务吗?

objective-c - scheduleInRunLoop - 线程网络连接

c# - ListView不会删除Xamarin.Forms中的项目。我已将ObservableCollection分配给ListView itemsource。 MVVM

c# - Autofac 并不总能解决我的依赖关系

c# - 简单地将值从一种形式传递到另一种形式

c# - 如何为ListView制作滚动事件

java - 我可以使用 CountDownLatch 控制线程执行顺序吗?

java - 什么时候在 Java 中选择多个进程而不是线程?