我使用Visual Studio 2013创建了一个相当复杂的.NET 4.0(C#)Windows窗体应用程序。但问题非常普遍,并且应该适用于其他版本的.NET和VS.
在启动时,系统读取配置文件,解析文件文件夹并读取文件内容,从数据库读取数据,执行Web请求以及将数据添加到主启动表单上的许多控件。
我想避免使用“等待沙漏”的启动画面,目标是使应用程序快速启动并立即显示主窗体。
我的解决方案是将backgroundworker用于某些启动任务,使应用程序在获取数据时可见且响应迅速。然后,用户可以选择离开启动表单并开始执行其他任务,而无需等待所有启动过程完成。
使用backgroundworker适合这个吗?
应该考虑使用哪些其他方法来代替背景工作者,或者除了背景工作者之外,还可以考虑使用大量启动程序来快速启动应用程序?
在任何情况下,它取决于早期访问可用性是否对用户有意义。一个好方法也是在用户可以看到界面(之前的Splashscreen或加载栏)之前预加载第一页/表单/选项卡。
加载第一个位时,您可以异步缓存更多数据,并且只允许用户在完成这些组件的缓存时切换页面/选项卡(在执行此操作时,您必须显示“仍然加载”消息或灰显其他选项卡不要混淆用户)。如果用户选择使用页面/选项卡/功能来减少加载不必要的信息,您也可以加载附加数据,但这会导致在使用应用程序时等待 - 这取决于您。
从技术上讲,由于BackgroundWorker在.NET 4.5中被明确标记为过时,您应该看看引入的await / async是否会为您提供更优雅的解决方案(请参阅MSDN Asynchronous Programming with Async and Await 简介)
MSDN说:
在几乎所有情况下,基于异步的异步编程方法优于现有方法。特别是,对于IO绑定操作,此方法优于BackgroundWorker,因为代码更简单,您无需防范竞争条件。
查看比较主题Background Worker vs Await/Async
如果您选择使用该技术,请参阅backgroundworker code to load GUI数据的评论良好的示例
在我的应用程序中,我使用启动画面。但是,我没有显示等待沙漏。相反,它显示了写入当前操作的状态行,例如“读取配置文件”,“连接到数据库”,“执行Web请求”等。
当然,应用程序启动速度不快,但用户没有挂起程序的感觉,而且看起来更快。
而不是建议而不是答案: