首先,我已经阅读了很多关于这个问题的资料,但我的脑海中并不清楚。
我正在开发一个WPF应用程序,它意味着从数据库、本地/远程文件、WPF服务等加载大量信息。比如说,这些数据被加载到datagrids和这类控件中。
我的应用运行良好,但数据加载过程产生了糟糕的用户体验。例如,我将重点放在主窗口中,它需要大量数据,因此需要2-3秒才能加载并显示在网格中。
当我第一次执行应用程序时,我真正希望看到的是GUI立即加载,然后让数据加载工作,显示微调、等待对象或网格上的任何东西,直到这些进程完成(异步?)装好了。
在这种情况下(在我的测试中),无论加载数据(我的意思是在代码中)的顺序是在哪里进行的:在构造函数内部,在几个事件(initialized,load,等等)的末尾,在ShowDialog指令之前的Init方法中...GUI窗口不会出现,直到我的网格加载了这些东西。
我想我应该处理线程,一个用于GUI,另一个异步用于加载数据,但我已经使用Dispatcher、Delegates等进行了一些测试,但都没有成功。
总而言之,目标是尽可能快地加载GUI,然后加载数据并刷新GUI。
现在我有点困惑了,我读到了关于线程、分派器等的问题,但我不知道它们是否适用于我的需求。我希望你能告诉我该怎么走。
你好,博尔哈。
发布于 2013-05-16 04:43:57
这是技术问题,但通常使用ObservableCollection将数据分成较小的项。您可以在20个块上添加项目,并让UI也显示微调器,同时保持响应。保持区块加载在50ms,而且你永远不会直接在UI线程上加载数据,而是在辅助线程(后台工作线程)上加载数据。
发布于 2013-05-16 04:56:06
如果绝对需要大数据集和将所有数据加载到内存中,请考虑以下内容:
当您对web服务进行同步调用时,您实际上并没有执行任何处理,而是在返回结果之前锁定执行。如果您使用异步调用,您将实际发送请求,然后您的程序将继续执行,直到web服务返回结果。
如果异步调用不起作用,只需使用BackgroundWorker在不同的线程上完成所有数据工作。
这两种方法都应该释放主线程,并允许呈现窗体。
https://stackoverflow.com/questions/16573736
复制相似问题