2013-05-15 33 views
1

首先,我一直在阅读很多关于这个问题,但在我的脑海里并不清楚。图形用户界面和数据加载并行

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

我的应用工作正常,但数据加载过程会产生不良的用户体验。例如,我将主要关注于主窗口,该窗口需要大量数据,因此需要2-3秒才能加载并显示在网格中。

当我第一次执行它时,我真的很想在我的应用程序中看到GUI是立即加载的,然后让数据加载工作,显示一个微调器,等待对象或网格上的任何东西,直到这些进程是异步?)加载。在这种情况下(在我的测试中),无论加载数据的顺序(在代码中,我的意思是):在构造函数中,在几个事件的末尾(初始化,加载等) ),在ShowDialog指令前面的Init方法中... GUI窗口直到我的网格加载了东西才会出现。

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

总之,目标是尽可能快地加载GUI,然后加载数据并刷新GUI。

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

Regards, Borja。

+2

我懒得看完你在这里写的所有内容。改为发布一些相关的代码 –

+1

BackgroundGround工作和优先级绑定。并清理问题。 – Paparazzi

+0

主要的解决方案是避免大数据集(毕竟,它是一个GUI,用户为U)。第二种选择:从最小填充的虚拟机开始,并从线程更新列表(可观测数据)。 –

回答

0

这是技术性的东西,但通常你使用ObservableCollection将数据分割成更小的项目。您将项目添加到20块,并让UI也显示微调,同时保持响应。将块加载保持在50ms,也不会直接在UI线程上加载数据,而是在辅助线程(后台工作者)上加载数据。

0

如果大数据集和所有的数据加载到内存中是绝对需要的,然后再考虑这一点:

当您对Web服务的同步调用,您实际上并不做任何处理,但你锁定直到返回结果。如果您使用异步调用,则实际上会发送请求,然后您的程序将继续执行,直到Web服务返回结果。

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

这两个都会导致释放主线程并允许表单呈现。

+0

BackgroundWorker工作正常。对于这种情况,我使用BW的两个事件:DoWork(做我的东西)和RunWorkerCompleted(更新GUI)。但考虑到(我不知道我的方法是否正确),GUI必须从创建GUI东西的同一个线程更新,因此这项任务必须由调度员以这种方式完成: ** this。 Dispatcher.Invoke((Action)(()=> { // GUI updates })); ** –

+0

您是否确实需要在DoWork期间用数据更新UI?如果你想使用像你这样的微调问题,我不确定你为什么需要this.Dispatcher.Invoke(),它只是一个持续到RunWorkerComplete的动画。如果您想传递完成百分比,则可以使用BackgroundWorker的ReportProgress方法。 –