| WPF开发之ListView进行大数据量异步加载实现, 在测试大数据量加载的时候,我们有两件事情需要完成,第一个就是考虑到大数据量,我们得利用异步方式来进行,否则界面及其容易被阻塞住;第二个就是由于数据量过大,导入时间可能比较长,如何通知用户当前导入的进度。
针对问题一,可以考虑利用委托的异步方式进行;针对问题二,可以考虑到线程和UI交互的方式。
首先要说的是大数据量的导入,和WinForm不同的是,在导入数据到ListView之前,我们需要先将数据导入到一个DataTable中,然后利用GridView来处理DataTable,最后绑定即可,见代码流程:
/// <summary> /// 开始对BindData函数进行异步处理 /// </summary> private void BeginBindData() { ........ }
/// <summary> /// 对BindData函数进行异步处理完毕,向用户发送通知 /// </summary> /// <param name="iar"></param> private void EndBindData(IAsyncResult iar) { ........ }
/// <summary> /// 考虑到BindData导入数据比较耗时,采用了BeginBindData来进行异步加载 /// </summary> private void BindData() { ........ }
这就是整个异步加载方式的执行流程,下面见具体代码:
#region Invoke the Binding Data method asynchorously
/// <summary> /// 开始对BindData函数进行异步处理 /// </summary> private void BeginBindData() { BindDataAsync bindData = new BindDataAsync(BindData); IAsyncResult iar = bindData.BeginInvoke(new AsyncCallback(EndBindData), bindData); tsStatus.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(delegate { tsStatus.Content = "正在加载中。。。"; })); }
/// <summary> /// 对BindData函数进行异步处理完毕,向用户发送通知 /// </summary> /// <param name="iar"></param> private void EndBindData(IAsyncResult iar) { tsStatus.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(delegate { tsStatus.Content = "加载完毕。。。"; })); BindDataAsync bindData = (BindDataAsync)iar.AsyncState; bindData.EndInvoke(iar); }
|