原文:利用WPF的ListView进行大数据量异步加载

由于之前利用Winform的ListView进行大数据量加载的时候,诟病良多,所以今天试着用WPF的ListView来做了一下,结果没有让我失望,我将一个拥有43000行,510列的csv文件导入到了ListView中,总共耗时在10s左右,并且在导入的过程中,软件界面上的提示信息一直在提示当前导入了多少条。在整个导入的过程中没有感觉到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);
}

/// <summary>
/// 考虑到BindData导入数据比较耗时,采用了BeginBindData来进行异步加载
/// </summary>
private void BindData()
{

GetHeader();
DataTable dt = LoadData();

tsStatus.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(delegate
{
tsStatus.Content = "正在绑定数据,请稍候。。。";
}));

//using Dispatcher to avoid crossing thread exception
listView1.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(delegate
{

foreach (DataColumn item in dt.Columns)
{
GridViewColumn gvc = new GridViewColumn();
//设置行的绑定源
gvc.DisplayMemberBinding = new Binding(item.ColumnName);
//设置头部名称
gvc.Header = item.ColumnName;
gv.Columns.Add(gvc);
}

//设置显示方式,利用GridView来显示
listView1.View = gv;
//设置待绑定的上下文数据对象
listView1.DataContext = dt;
//绑定数据,不可缺少,否则导致绑定失败
listView1.SetBinding(ListView.ItemsSourceProperty, new Binding());


}));
}
#endregion

其次,关于如何向用户发送通知,这个涉及到了线程和UI交互,在Winform中我们可以通过Control.InvokeRequired来判断是否需要进行交互,然后通过Invoke方法进行进一步处理,而在WPF中,则需要利用Dispacther来进行处理,也即:Control.Dispacter方法,在代码中,是这样做到的(拿名称为tsStatus的Label控件来说):

 tsStatus.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(delegate
{
tsStatus.Content = "当前已经加载"+count+"条数据。。。";
}));

在Action中用了匿名方法来实现,非常方便。

源代码下载:点击这里下载

利用WPF的ListView进行大数据量异步加载的更多相关文章

  1. (转)利用WPF的ListView进行大数据量异步加载

    原文:http://www.cnblogs.com/scy251147/archive/2012/01/08/2305319.html 由于之前利用Winform的ListView进行大数据量加载的时 ...

  2. 参考 ZTree 加载大数据量。加载慢问题解析

    参考 ZTree 加载大数据量. 1.一次性加载大数据量加载说明 1).zTree v3.x 针对大数据量一次性加载进行了更深入的优化,实现了延迟加载功能,即不展开的节点不创建子节点的 DOM. 2) ...

  3. 利用MySQL数据库如何解决大数据量存储问题?

    提问:如何设计或优化千万级别的大表?此外无其他信息,个人觉得这个话题有点范,就只好简单说下该如何做,对于一个存储设计,必须考虑业务特点,收集的信息如下:1.数据的容量:1-3年内会大概多少条数据,每条 ...

  4. [android] 数据的异步加载和图片保存

    把从网络获取的图片数据保存在SD卡上, 先把权限都加上 网络权限 android.permission.INTERNET SD卡读写权限 android.permission.MOUNT_UNMOUN ...

  5. EChart数据的异步加载和更新

    ECharts是国内开发一款图标插件,在网页中我们经常要用到图标显示,直接引用十分方便. 直接到ECharts主页调用插件 <!DOCTYPE html> <html style=& ...

  6. [Sw] 使用 Swoole Server task/协程 处理大数据量异步任务时注意

    关于 Buffered Query 和 Unbuffered Query:http://www.php.net/manual/zh/mysqlinfo.concepts.buffering.php 对 ...

  7. MySQL数据库如何解决大数据量存储问题

    利用MySQL数据库如何解决大数据量存储问题? 各位高手您们好,我最近接手公司里一个比较棘手的问题,关于如何利用MySQL存储大数据量的问题,主要是数据库中的两张历史数据表,一张模拟量历史数据和一张开 ...

  8. Android学习笔记_36_ListView数据异步加载与AsyncTask

    一.界面布局文件: 1.加入sdcard写入和网络权限: <!-- 访问internet权限 --> <uses-permission android:name="andr ...

  9. extjs4.0 treepanel节点的选中、展开! 数据的重新加载

    1.extjs4.0API较3.0有非常大变化2.多级子父节点的选中和展开.3.数据的重新加载.tree.getStore().load4.节点的移除,从树中根据ID获取节点 tree.getStor ...

随机推荐

  1. 11、V4L2摄像头获取单幅图片测试程序

    #根据网上常见的一个测试程序修改而来 by rockie cheng#include <stdio.h>#include <stdlib.h>#include <stri ...

  2. 《Unix编程艺术》读书笔记(1)

    <Unix编程艺术>读书笔记(1) 这两天開始阅读该书,以下是自己的体会,以及原文的摘录,尽管有些东西还无法全然吃透. 写优雅的代码来提高软件系统的透明性:(P134) Elegance ...

  3. POJ - 2286 - The Rotation Game (IDA*)

    IDA*算法,即迭代加深的A*算法.实际上就是迭代加深+DFS+估价函数 题目传送:The Rotation Game AC代码: #include <map> #include < ...

  4. 【苦读官方文档】2.Android应用程序基本原理概述

    官方文档原文地址 应用程序原理 Android应用程序是通过Java编程语言来写.Android软件开发工具把你的代码和其它数据.资源文件一起编译.打包成一个APK文件,这个文档以.apk为后缀,保存 ...

  5. jquery-11 jquery中的事件切换如何实现

    jquery-11 jquery中的事件切换如何实现 一.总结 一句话总结:事件切换hover()和toggle()函数.参数两个,都是函数,依次执行两个函数. 1.如何实现单击切换图片? 用togg ...

  6. php-post模拟登录,同步登录(摘自网络)

    这也是个老生常谈的话题了,上午花了点时间把这个问题整理了一下. 一般来说用PHP来模拟post提交数据有三种方法,file_get_contents.curl和socket. 写了个公用函数,专门用来 ...

  7. 【2001】关于N!的问题

    Time Limit: 3 second Memory Limit: 2 MB 编写程序,计算n!以十进制数形式表示的数中最右边一个非零数字,并找出在它右边有几个零. 例如:12!=1*2*3*4*5 ...

  8. 【心情】codeforces涨分啦!

    虽然只有10分. 第二次比赛!

  9. TensorFlow中卷积

    CNN中的卷积核及TensorFlow中卷积的各种实现 声明: 1. 我和每一个应该看这篇博文的人一样,都是初学者,都是小菜鸟,我发布博文只是希望加深学习印象并与大家讨论. 2. 我不确定的地方用了“ ...

  10. .net core 下的分布式事务锁

    原文:.net core 下的分布式事务锁 目录 系统分布式锁的用法 锁的实现 锁的使用 API内的范例: 引用链接 系统分布式锁的用法 公司框架新增功能分布式锁: 锁的性能之王: 缓存 > Z ...