改善感知的WPF应用启动时间

Mar*_*arc 8 .net c# wpf performance app-startup

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

我尝试在主窗口的构造函数中构建用户控件(并执行所有数据加载):
启动屏幕将以这种方式显示5s,然后是1s的空主窗口,直到应用程序准备好使用.
用户表示,在某些(视觉上)发生之前需要很长时间.

然后我将用户控件创建(和数据加载)移动到主窗口的Loaded事件处理程序中:启动屏幕将显示3s,然后是3s的空主窗口,直到应用程序准备就绪.
用户说它"更好",但不喜欢半完成主窗口显示处于禁用状态这么久的事实.

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

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

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

Edit2:我正在使用带有System.Data.SQLite和EF4的.net 4来加载数据.有大约4000行和30列.

HCL*_*HCL 13

异步加载数据.在加载时为用户在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();  
Run Code Online (Sandbox Code Playgroud)

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

更新

我不确定我是否理解你的问题.如果您的问题不是需要加载数据的时间,那么应用程序中的某些内容就很奇怪了.WPF是IMO非常快.控制创建不需要花费很多时间.我在几毫秒内提到了更大的列表.

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