【问题标题】:GUI and Data loading parallelGUI 和数据加载并行
【发布时间】:2013-05-15 19:47:23
【问题描述】:

首先,我已经阅读了很多关于这个问题的信息,但我并不清楚。

我正在开发一个 WPF 应用程序,它意味着从数据库、本地/远程文件、Web 服务等加载大量信息。假设,这些数据被加载到数据网格和这种控件中。

我的应用运行良好,但数据加载过程会产生糟糕的用户体验。例如,我将重点放在主窗口,它请求大量数据,因此加载并显示在网格中需要 2-3 秒。

当我第一次执行它时,我真正想在我的应用程序中看到的是,GUI 立即加载,然后让数据加载工作,在网格上显示微调器、等待对象或其他任何东西,直到这些进程(异步?) 已加载。

在这种情况下(在我的测试中),无论加载数据的顺序(我的意思是在代码中)是在哪里进行的:在构造函数内部,在几个事件的末尾(初始化、加载等) ,在 ShowDialog 指令之前的 Init 方法中... GUI 窗口在我的网格加载内容之前不会出现。

我想我应该处理线程,一个用于 GUI,另一个异步用于加载数据,但我已经用 Dispatcher、Delegates 等进行了一些测试,但没有成功。

综上所述,目标是尽可能快地加载 GUI,然后加载数据并刷新 GUI。

现在我有点困惑,我阅读了有关线程、调度程序等的问题,但我不知道它们是否适用于我的需求。希望你能告诉我要走的路。

问候, 博尔哈。

【问题讨论】:

  • 我懒得看你在这里写的所有东西。而是发布一些相关代码
  • BackgroundGround worker 和优先级绑定。并清理问题。
  • 主要解决方案是避免使用大数据集(毕竟,它是一个 GUI,U 代表用户)。第二种选择:从一个最小填充的虚拟机开始,然后从一个线程更新列表(observables)。
  • 您是否在您的DataGrids 上启用了Visualization

标签: c# wpf database user-interface parallel-processing


【解决方案1】:

这是技术问题,但通常您使用 ObservableCollection 将数据分成更小的项目。您以 20 个为一组添加项目,并让 UI 也显示微调器,同时保持响应。将块加载保持在 50 毫秒,而且您永远不会直接在 UI 线程上加载数据,而是在辅助线程(后台工作人员)上。

【讨论】:

    【解决方案2】:

    如果绝对需要大数据集并将所有数据加载到内存中,那么考虑一下:

    当您对 Web 服务进行同步调用时,您实际上并没有进行任何处理,而是锁定了执行,直到返回结果。如果您使用异步调用,您将实际发送请求,那么您的程序将继续执行,直到 Web 服务返回结果。

    如果异步调用不起作用,只需使用 BackgroundWorker 在不同线程上处理所有数据。

    这两者都应该导致释放主线程并允许呈现表单。

    【讨论】:

    • BackgroundWorker 运行良好。为此,我使用 BW 的两个事件:DoWork(做我的事情)和 RunWorkerCompleted(更新 GUI)。但考虑到(我不知道我的方法是否正确)必须从创建 GUI 内容的同一线程更新 GUI,因此此任务必须由调度程序以这种方式完成:this.Dispatcher .Invoke((Action)(() => { // GUI 更新 }));
    • 你真的需要在 DoWork 期间用数据更新 UI 吗?如果您想使用像您提出的问题那样的微调器,我不确定您为什么需要 this.Dispatcher.Invoke(),它只是一个持续到 RunWorkerComplete 的动画。如果你想通过百分比完成,你可以使用 BackgroundWorker 的 ReportProgress 方法。
    猜你喜欢
    • 2020-01-22
    • 2014-05-11
    • 2014-01-31
    • 2016-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多