加载大量的前期数据。 。同步或异步。

时间:2008-12-13 02:13:26

标签: c# winforms multithreading

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

还有其他想法吗?

3 个答案:

答案 0 :(得分:4)

我写了许多与你描述的行为类似的应用程序,并为你提出了三个建议......

启动画面

在应用程序中添加启动画面,显示许多启动步骤的状态。我曾经使用过这个,当应用程序在启动时,在用户使用应用程序之前必须执行许多步骤 - 通过Active Directory确认身份和访问权限,联系数据库获取系统信息,加载静态数据,与指定Web服务的初始联系,检查先决条件(如Crystal报表)是否已安装并正常工作等。

<强>订阅

让每个组件对您的数据加载器感兴趣,并在数据可用时收到通知。这是观察者模式,没有任何问题,尽管管理订阅可能有点混乱。

延迟加载

设计应用程序的其余部分以尽可能晚地请求数据,从而尽可能广泛地完成后台加载。启动后快速脱离标记的用户必须等待加载必要的数据;花时间(可能是他们启动应用程序然后切换到Outlook)的用户立即找到响应。

答案 1 :(得分:1)

我在桌面应用程序中执行

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

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

DataManager.LoadDataAsync(dataCommandPatternObject, CallBackFunction);

...

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

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

如果需要预先加载数据,则加载屏幕(启动画面)可以请求许多数据,并且当每个数据块加载时,将触发回调。当所有回调都被触发时,就会出现闪屏。

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

答案 2 :(得分:1)

我建议您使用Observer Pattern并设置所有依赖于正在加载的数据集的类。为了最大限度地减少用户需要等待的时间,您还可以考虑实现两类需要整个数据集运行的类,以及一旦加载了数据子集就可以运行的类。

Observer Design Pattern