用DataGridView无分页绑定一个几千条数据的查询,查询的时候界面直接卡死十几秒,用户体验非常不好,因此用异步操作解决界面卡死的问题
原本场景:点击[查询]后,界面直接卡死
优化场景:点击[查询]后,界面可以随意移动,感觉不到后台在做大量数据的读取和绑定

private void btnQuery_Click(object sender, EventArgs e)
{
// 查询按钮点击后,按钮文本由"查询"改为"加载中",并把按钮状态改为不可点击
btnQuery.Text = "加载中...";
btnQuery.Enabled = false;
// 使用匿名方法定义一个委托事件,委托事件主要操作数据库查询,并返回查询的结果,不涉及任何UI操作
Func<DataTable> act = () =>
{
string sqlstmt = GetQuerySQL();
DbParams dbpara = new DbParams(DbFactory.Instance.ProviderName);
dbpara.AddInputDateTime("@beginTime", dtpStart.Value);
dbpara.AddInputDateTime("@endTime", dtpEnd.Value);
DataTable dtUserList = DbFactory.Instance.ExecuteDataTable(sqlstmt, dbpara.ToArray());
return dtUserList;
};
// 异步调用委托事件,在委托事件回调方法中,使用任意控件的异步方法把查询结果绑定到数据表控件中
act.BeginInvoke((result) =>
{
DataTable dtResult = act.EndInvoke(result);
// this是当前WinForm窗口的实例,也可以替换为界面中的任意控件示例,如dgvMain.BeginInvoke
this.BeginInvoke(new Action<DataTable>((DataTable dtList) =>
{
dgvMain.DataSource = dtList;
btnQuery.Text = "查询(&Q)";
btnQuery.Enabled = true;
}), dtResult);
}, null);
}

WinForm DataGridView显示行头序号代码

this.dgvMain.RowPostPaint += (object sender, DataGridViewRowPostPaintEventArgs e) =>
{
DataGridView dgv = sender as DataGridView;
SolidBrush b = new SolidBrush(dgv.RowHeadersDefaultCellStyle.ForeColor);
e.Graphics.DrawString((e.RowIndex + ).ToString(System.Globalization.CultureInfo.CurrentUICulture), dgv.DefaultCellStyle.Font, b, e.RowBounds.Location.X + , e.RowBounds.Location.Y + );
};

参考文章:
http://www.cnblogs.com/yuyijq/archive/2010/01/11/1643802.html

版权声明:本文采用署名-非商业性使用-相同方式共享(CC BY-NC-SA 3.0 CN)国际许可协议进行许可,转载请注明作者及出处。
本文标题:WinForm查询大数据界面假死,使用异步调用解决
本文链接:http://www.cnblogs.com/sochishun/p/7168815.html
本文作者:SoChishun (邮箱:14507247#qq.com | 博客:http://www.cnblogs.com/sochishun/)
发表日期:2017年7月14日

WinForm查询大数据界面假死,使用异步调用解决的更多相关文章

  1. C# Winform 窗体界面”假死”后台线程阻塞 解决办法–BeginInvoke

    原文:C# Winform 窗体界面"假死"后台线程阻塞 解决办法–BeginInvoke 这个方法可以用在任何后台任务耗时较长,造成界面“假死”界面控件不更新的情况. 比如要要执 ...

  2. WinForm多线程+委托防止界面假死

    当有大量数据需要计算.显示在界面或者调用sleep函数时,容易导致界面卡死,可以采用多线程加委托的方法解决 using System; using System.Collections.Generic ...

  3. WinForm程序界面假死,寻求完美解决方案

    故事的开端是这样的,小白是一个程序员,他确实也是一个小白,目前还在程序员发展的道路上,兢兢业业的小心求学. 有一天,小白接到一个任务,完成一个Winform程序,附加一个功能就是可以读IC卡. 小白终 ...

  4. C#中异步及winform中界面假死

    c#中可以用BeginInvoke去启动异步调用,但是有两个BeginInvoke一个是controller的BeginInvoke还有一个是委托的BeginInvoke. 主要区别是controll ...

  5. winform程序内存不足或假死的问题

    最近一直在写一个winform程序,对各类文档文件,以及压缩包的内容进行关键字检测. 模型出来之后,执行了一下,发现连续测试后,会有内存不足的问题,导致程序面假死.脑袋懵逼了两天. 回头看我的变量容器 ...

  6. listener.log文件过大导致oracle假死

    /home/u01/oracle/product/11gr2/db_1/log/diag/tnslsnr/VM_179_95_centos/listener/trace/listener.log li ...

  7. 在HDInsight中从Hadoop的兼容BLOB存储查询大数据的分析

    在HDInsight中从Hadoop的兼容BLOB存储查询大数据的分析 低成本的Blob存储是一个强大的.通用的Hadoop兼容Azure存储解决方式无缝集成HDInsight.通过Hadoop分布式 ...

  8. Qt多线程和GUI界面假死(run()是线程的入口,就像main()对于应用程序的作用。分析QThread::exec函数的源码,旧的QMutexLocker模式其实很好用,挡住别人进入抢占资源,可照抄)good

    QThread的常见特性: run()是线程的入口,就像main()对于应用程序的作用.QThread中对run()的默认实现调用了exec(),从而创建一个QEventLoop对象,由其处理该线程事 ...

  9. [WP8.1UI控件编程]Windows Phone大数据量网络图片列表的异步加载和内存优化

    11.2.4 大数据量网络图片列表的异步加载和内存优化 虚拟化技术可以让Windows Phone上的大数据量列表不必担心会一次性加载所有的数据,保证了UI的流程性.对于虚拟化的技术,我们不仅仅只是依 ...

随机推荐

  1. Git----01介绍&下载&安装&创建本地仓库

    一.Git介绍 1.0.Git是分布式版本控制工具 1.1.历史 Linux 内核开源项目有着为数众广的参与者.绝大多数的 Linux 内核维护工作都花在了提交补丁和保存归档的繁琐事务上(1991-2 ...

  2. AbstractQueuedSynchronizer 原理分析 - 独占/共享模式(转)

    1.简介 AbstractQueuedSynchronizer (抽象队列同步器,以下简称 AQS)出现在 JDK 1.5 中,由大师 Doug Lea 所创作.AQS 是很多同步器的基础框架,比如 ...

  3. spring study

    Dependency Injection The Inversion of Control(IoC) is a general concept, and it can be expressed in ...

  4. dubbo实际应用中的完整的pom.xml

    http://blog.csdn.net/rodjohnsondoctor/article/details/39030601

  5. string类型的常用方法

    1. 在尾部插入/删除元素 string s("hello"); // 插入/删除一个字符 s.push_back('!'); s.pop_back(); // 插入多个字符 s. ...

  6. IDEA下载插件超时的原因

    setting中红框的对勾去掉就可以下载插件了

  7. Daily Scrum9 11.13

    昨天的任务已完成. 今日任务: 姓名 今日任务 时长 徐钧鸿 测试SQL包里的代码 2h 张艺 继续搭建还没搭建完的框架 修复bug 2h 黄可嵩 继续进行搜索响应编写 2h 徐方宇 搭建框架 修改b ...

  8. web12 使用map型的request、session、application

    电影网站:www.aikan66.com 项目网站:www.aikan66.com 游戏网站:www.aikan66.com 图片网站:www.aikan66.com 书籍网站:www.aikan66 ...

  9. 第三周作业(三)WordCount

    这个程序主要就是统计一下文件中的字符数,单词数以及行数. 我的程序很简单,代码很简短,只实现了书中的基本功能. #include <stdio.h> #include <string ...

  10. ThinkPhp输入参数过滤

    I('id',0); // 获取id参数 自动判断get或者post,不存在时返回默认值0 I('post.name','','htmlspecialchars'); //获取$_POST['name ...