我有一个WPF数据库查看器应用程序:这是一个简单的主窗口,其中包含带有数据网格的用户控件,显示从SQLITE数据库中提取的数据。
问题在于,此应用程序需要6秒钟才能开始使用。

我尝试在主窗口的构造函数中构建用户控件(并执行所有数据加载):
Splash屏幕将以这种方式显示5s,然后将1s的空主窗口显示为1s,直到准备使用该应用程序为止。
用户说,要花太长时间(直到(视觉上)发生)。

然后,我将用户控件创建(和数据加载)移至主窗口的加载事件处理程序中:Splash屏幕将显示3s,然后显示3s空主窗口,直到准备就绪。
用户说这是“更好的”,但不喜欢这样的事实,即一半完成的主窗口在残疾状态显示了这么长时间。

是否有关于感知到的应用程序加载时间的一般建议,或者关于如何改善这种情况有其他建议?
我相信理想情况下,主窗口将尽可能快地显示,并进行一些小时玻璃或旋转器,直到加载数据为止。但是,我不能仅仅将用户控制创建移至背景工人中,因为这将在错误的线程上完成。

有人对这个问题有任何建议吗?

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

EDIT2:我将.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非常快。控制创造并不需要很多时间。我在一些毫秒中提到的正如您提到的更大的列表。

尝试查看UI中是否有一些阻碍数据杂志虚拟化项目的内容。也许您在那里有一个预选。要分析WPF应用程序,我可以向您推荐 WPF分析工具.

其他提示

您可以做的最明显的事情是介绍您的应用程序并在启动时间找到瓶颈。听起来最有可能的罪魁祸首是从数据库中加载数据。

我了解到的一堂课是,如果您使用ORM,则在加载大数据集时,如果您喜欢Poco(普通的旧clr/c#对象),而不是ORM生成的数据库实体(请参见下面的示例),则加载时间将是一个更快的速度和RAM使用率也将大大减少。这样做的原因是,EF将尝试加载整个实体(即所有字段),并可能与您的实体相关的全部数据负载,甚至大多数您都不需要。您真正需要直接与实体合作的唯一一次是进行插入/更新/删除操作时。阅读数据时,您应该 只要 获取您的应用程序需要显示和/或验证的字段。

如果您遵循MVVM模式,则上述体系结构并不难实现。

将数据加载到POCOS中的示例:

var query = from entity in context.Entities
                select new EntityPoco
                {
                    ID = entity.ID,
                    Name = entity.Name
                };

return query.ToList();

POCOS是每个字段具有自动核心的非常简单的类。

我们通常为应用程序中的每个实体提供存储库,每个存储库负责获取与该实体相关的数据。视图模型引用了所需的存储库,因此它们不直接使用EF。当用户进行需要持久的更改时,我们使用存储库中的其他方法,然后仅加载一个子集(即用户更改的实体)并应用必要的更新 - 通过ViewModel进行了一些验证,并可能其他验证进行了其他验证。通过约束/触发器在数据库中进行,等等。

这件事情是由很多原因导致的。

1)部署机的配置可能相当低。
2)数据绑定或数据绑定问题。

可能的解决方案是:
1)懒惰加载数据
2)优化性能。 http://msdn.microsoft.com/en-us/library/aa970683.aspx

我已经看到应用程序在WPF中渲染了500万记录。

PS:由于列订单访问,可能是30列可能的原因可能是30列。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top