原文:利用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. Vmware P2V 清除被隱藏網卡佔用的的IP

    修改註冊表也可以讓非正常卸載的網卡釋放捆綁的固定的IP地址,註冊表中定位於中:HKEY_LOCAL_MACHINE \SYSTEM\ CurrentControlSet\Services\Tcpip\ ...

  2. openGL线型和线宽以及线的抗锯齿

    openGL线型和线宽以及线抗锯齿 一. 线宽 Opengl的线宽设置:glLineWidth(width); width为float类型值,在0~10.0,大于10以上按10来处理. 若开启线的反走 ...

  3. php面试题二--解决网站大流量高并发方案(从url到硬盘来解决高并发方案总结)

    php面试题二--解决网站大流量高并发方案(从url到硬盘来解决高并发方案总结) 一.总结 从外到内解决网站大流量高并发问题---从提交一个url开始(从用户按下搜索栏回车键开始) url最开始会到d ...

  4. 【34.57%】【codeforces 557D】Vitaly and Cycle

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  5. 【搜索引擎Jediael开发笔记】v0.1完整代码 2014-05-26 15:17 463人阅读 评论(0) 收藏

    详细代码请见 E:\Project\[重要]归档代码\SearchEngine归档代码 或 https://code.csdn.net/jediael_lu/jediael/tree/10991c83 ...

  6. USB 3.0规范中译本 第3章 USB 3.0体系结构概览

    本文为CoryXie原创译文,转载及有任何问题请联系cory.xie#gmail.com. 本章呈现USB 3.0体系结构和关键概念的概览.USB 3.0与前面版本的USB类似,因为它是线缆总线,支持 ...

  7. 无法为数据库中的对象分配空间,因为'PRIMARY'文件组已满

    用SQL Server2012,做数据保存时出错,错误信息:无法为数据库'***'中的对象'***'分配空间,因为'PRIMARY'文件组已满.请删除不需要的文件.删除文件组中的对象.将其他文件添加到 ...

  8. [NPM] List available npm scripts and support tab completion

    In this lesson we will look at different ways you can list the available npm scripts. Whether we wan ...

  9. 【计算机视觉】OpenCV中直方图处理函数简述

    计算直方图calcHist 直方图是对数据集合的统计 ,并将统计结果分布于一系列提前定义的bins中.这里的数据不只指的是灰度值 ,统计数据可能是不论什么能有效描写叙述图像的特征. 如果有一个矩阵包括 ...

  10. 谷歌 AI 中国中心成立,人工智能势不可挡?

    昨日,谷歌在上海举办了一年一度的Google中国开发者大会.在本届大会上,谷歌云首席科学家李飞飞宣布了一个重磅消息,即在北京将成立谷歌AI中国中心.对于这个即将成立的AI中心谷歌寄予厚望,希望与中国本 ...