c# - 改善可感知的 WPF 应用程序启动时间

标签 c# .net wpf performance app-startup

我有一个 WPF 数据库查看器应用程序:它是一个简单的主窗口,包含一个用户控件和一个数据网格,显示从 SQLite 数据库中提取的数据。
问题是此应用程序需要 6 秒才能启动,直到可用为止。

我尝试在主窗口的构造函数中构建用户控件(并加载所有数据):
初始屏幕将以这种方式显示 5 秒,然后是 1 秒的空主窗口,直到应用程序准备就绪。
用户表示(视觉上)发生某些事情需要很长时间。

然后我将用户控件的创建(和数据加载)移动到主窗口的 Loaded 事件处理程序中: 初始屏幕将显示 3 秒,然后是 3 秒的空主窗口,直到应用程序准备就绪。
用户说它“更好”,但不喜欢半完成的主窗口在禁用状态下显示这么长时间。

是否有一些关于感知的应用程序加载时间的一般性建议,或者是否有关于如何改善这种情况的任何其他建议?
我相信理想情况下,主窗口会尽可能快地显示,同时显示一些沙漏或微调器,直到数据加载完毕。但是我不能只将用户控件创建移动到后台工作程序中,因为这会在错误的线程上完成。

有人对这个问题有什么建议吗?

编辑:
请注意,现在我刚刚分配了一个 LINQ-to-EF 查询作为网格数据源。
一种可能的改进可能是在后台将此数据加载到数据表中,并仅在加载后分配它...

编辑2: 我将 .net 4 与 System.Data.SQLite 和 EF4 一起使用来加载数据。大约有 4000 行和 30 列。

最佳答案

异步加载数据。加载时在 GUI 上为用户展示一些不错的东西。以下代码可以帮助您解决此问题:

BackgroundWorker bgWorker = new BackgroundWorker() { WorkerReportsProgress=true};  
bgWorker.DoWork += (s, e) => {      
    // Load here your file/s      
    // Use bgWorker.ReportProgress(); to report the current progress  
};  
bgWorker.ProgressChanged+=(s,e)=>{      
    // Here you will be informed about progress and here it is save to change/show progress. 
    // You can access from here savely a ProgressBars or another control.  
};  
bgWorker.RunWorkerCompleted += (s, e) => {      
// Here you will be informed if the job is done. 
// Use this event to unlock your gui 
};  
bgWorker.RunWorkerAsync();  

该应用程序并不快,但似乎快得多,因为 GUI 立即可见且响应迅速。也许您还可以在加载其余数据的同时向用户显示已加载数据的一部分。使用 ProgressChanged 事件来执行此操作。

更新

我不确定我是否理解你的问题。如果您的问题不是需要加载时间数据,那么您的应用程序中有些地方很奇怪。 WPF 是 IMO 非常快。控件创建不会花费很多时间。正如您在几毫秒内提到的那样,我想象出更大的列表。

尝试查看您的 UI 中是否存在阻碍 DataGrid 虚拟化 Items 的内容。也许你在那里有问题。要分析 WPF 应用程序,我可以向您推荐 WPF Profiling Tools .

关于c# - 改善可感知的 WPF 应用程序启动时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4724774/

相关文章:

C# 字典和高效内存使用

c# - 正则表达式:匹配没有 "style"属性的 HTML 标签

c# - 命名空间 "clr-namespace:CefSharp.Wpf;assembly=CefSharp.Wpf"中不存在名称 ChromiumWebBrowser

c# - 添加内联后 TextBlock 文本属性仍然为 null

c# - 无法在引用 .Net 标准库的已发布 .Net 4.6.1 项目中加载文件或程序集 'System.ComponentModel.Annotations'

c# - WPF 自定义文字环绕

c# - HttpWebRequest 使用 cookie 重定向

c# - 使用 .NET (C#) 修改路由表

c# - 使用值属性作为键的字典

C# WPF 从另一个窗口刷新列表框