2008-12-13 102 views
2

所以我有一个winforms应用程序在启动时同步下载一组数据。这显然需要一段时间,但是当任何服务或GUI类加载时,它们都有这些数据。我可以改变它以置入后台线程,但是当需要访问这些数据的每个组件都需要在数据准备就绪时不断得到通知。这对于我的每一个类来说都是糟糕的设计,依赖于这些数据被加载来进行If(Loaded)检查或者必须订阅已加载的事件。 。 。有任何想法吗?加载大量的前期数据。 。同步或异步。

还有其他想法吗?

回答

4

我已经写了一些具有类似行为你描述的应用,并为您三点建议...

闪屏

添加一个启动画面到您的应用程序显示多个启动步骤的状态。过去,当应用程序在启动时需要执行多个步骤时,用户才能使用应用程序 - 通过Active Directory确认身份和访问授权,获取系统信息的联系人数据库,加载静态数据,与指定的Web服务的初次接触,检查先决条件(如Crystal Reports)安装和工作,等等等等

认购

与您的数据加载每个组件寄存器的兴趣,并通知当数据可用时。这是观察者模式,没有问题,尽管管理订阅可能有点麻烦。

延迟加载

设计你的应用程序,以尽可能晚地请求数据,从而为广泛用于后台加载一个机会,尽可能完成其余部分。在启动后快速脱离标记的用户必须等待加载必要的数据;花费时间的用户(也许他们启动了应用程序,然后切换到Outlook)发现立即响应。

1

我建议你使用观察者模式并设置所有依赖于被加载的数据集的类。为了最大限度地减少用户需要等待的时间,您还可以考虑实现两类需要整个数据集运行的类,以及那些可以在加载数据子集后起作用的类。

Observer Design Pattern

+0

很好的答案!我同意并将发布,直到你击败我! – BobbyShaftoe 2008-12-13 03:34:32

1

一切我做一个桌面应用程序,无论是的WinForms或WPF,我尝试在后台线程做。这样做有两个原因。首先,用户体验更好。其次,在WPF测试中,我发现在加载大量数据(如记录到网格或列表中)时,它是一个更好的执行者。

加载数据预付vs延迟加载实际上是一种每应用程序自定义。我会构建一个处理这两种情况的中央数据对象。我可能会建议这样做的方式是创建一个事件驱动的依赖模型。我的意思是,你可以在一个数据管理器对象上放置一个事件或回调注册函数,当它们需要使用数据时,各种代码单元可以订阅这些数据,然后在数据可用时回调它们。如果数据已经可用,则立即发生回调。否则,当数据从后台线程加载时,代码单元被回调。例如,在一些窗口或组件,你可能有一些代码,看起来像:

DataManager.LoadDataAsync(dataCommandPatternObject, CallBackFunction); 

... 

public void CallbackFunction(SomeDataObjectClass data) 
{ 
    //load data into UI 
} 

如果数据加载通过一个中央机构做那么如果被请求两次相同的数据,缓存的版本,可以使用或如果第一个请求仍在运行,则第二个请求可以等待。

如果需要预先加载数据,加载屏幕(启动画面)可以请求多个数据段,并且当每个数据块加载时都会触发回调。当所有的回调已经开始时,闪屏就会存在。

这些仅仅是我多年来用来管理加载大部分静态/查找数据的大型数据集的各种技术的几点。除此之外,我还建议对很少更改的非常大的数据集进行某种客户端磁盘缓存,并在数据库中实施某种更改跟踪。这将允许客户端从本地磁盘加载此数据,这会更快地转到数据库。它还可以让数据库扩展性更好,因为它没有提供高度重复的数据,而是专注于事务数据。