异步读取数据库,在数据绑定的时候会出现点问题,就是窗体界面会无法关闭,要结束任务才能结束进程。例如下面代码

首先按习惯的方法,设定线程更新UI

a2.CheckForIllegalCrossThreadCalls = false;   //a2为窗体名称

下面的代码就是从数据库里取得数据并绑定

private void button1_Click(object sender, EventArgs e)
        {
            SqlConnection con;
            SqlCommand com;
            try
            {
                con = new SqlConnection("UID=sa;Password=123;Initial Catalog=AD;Data Source=192.168.1.1;Asynchronous Processing=true");
                con.Open();
                com = new SqlCommand("select top 100 * from tb_user", con);
                com.BeginExecuteReader(new AsyncCallback(delDataBin), com);
            }
            catch (Exception ex)
            {
                MessageBox.Show("程序发生错误,信息: " + ex.Message);
            }

}

private void delDataBin(IAsyncResult ar)
        {
            if (ar.IsCompleted)
            {
                SqlCommand com = (SqlCommand)ar.AsyncState;
                SqlDataReader dr = com.EndExecuteReader(ar);
                DataTable dt = new DataTable();
                dt.Load(dr);
                dr.Close();

this.dataGridView1.DataSource = dt;   //绑定数据

}
        }

到这里完成的绑定的工作,运行查看一下效果,其实这样是会出现窗体假死的现象。

下面通过Invoke 来实现

首先声明委托  public delegate void updateDG(DataTable dt);

然后通过dataBin来绑定DataGridView

public void dataBin(DataTable dt)
        {
            dataGridView1.DataSource = dt;
            return;
        }

在线程里面调用下面方法

//绑定数据
                if (this.InvokeRequired)
                {
                    updateDG ur = new updateDG(dataBin);
                    this.Invoke(ur, dt);
                }

完整的代码如下:

private void button1_Click(object sender, EventArgs e)
        {
            SqlConnection con;
            SqlCommand com;
            try
            {
                con = new SqlConnection("UID=sa;Password=123;Initial Catalog=AD;Data Source=192.168.1.1;Asynchronous Processing=true");
                con.Open();
                com = new SqlCommand("select top 100 * from tb_user", con);
                com.BeginExecuteReader(new AsyncCallback(delDataBin), com);
            }
            catch (Exception ex)
            {
                MessageBox.Show("程序发生错误,信息: " + ex.Message);
            }

}

private void delDataBin(IAsyncResult ar)
        {
            if (ar.IsCompleted)
            {
                SqlCommand com = (SqlCommand)ar.AsyncState;
                SqlDataReader dr = com.EndExecuteReader(ar);
                DataTable dt = new DataTable();
                dt.Load(dr);
                dr.Close();

//this.dataGridView1.DataSource = dt;//绑定数据

if (this.InvokeRequired)
                {
                    updateDG ur = new updateDG(dataBin);
                    this.Invoke(ur, dt);
                }
            }
        }
       
        public delegate void updateDG(DataTable dt);

public void dataBin(DataTable dt)
        {
            dataGridView1.DataSource = dt;
            return;
        }

查运行查看一下,你就会发现结果了

转载于:https://www.cnblogs.com/whtydn/archive/2009/07/07/1518209.html

C# 异步读取数据库里面的数据与绑定UI的解决办法相关推荐

  1. asp.net中读取数据库中的数据可以使用DataReader和DataSet 2种方式(初学者望大家不要笑我)...

    在asp.net中,读取数据库中的数据可以使用DataReader和DataSet 2种方式, 两者的差异如下:     使用Dataset对象读取数据大致需要以下5个步骤:     (1)建立数据库 ...

  2. 数据库锁表及阻塞的原因和解决办法

    数据库锁表及阻塞的原因和解决办法 问题说明 当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况.若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性.加锁是 ...

  3. 串口发数据到android数据错误,51单片机通过蓝牙串口模块发送JSON数据给安卓手机故障解决办法...

    原标题:51单片机通过蓝牙串口模块发送JSON数据给安卓手机故障解决办法 JSON(Java Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式.它基于 ECMA (欧洲计 ...

  4. 对于stm32F103芯片读AT24C512得到的数据全是0xFF的解决办法

    对于stm32F103芯片读AT24C512得到的数据全是0xFF的解决办法 由于项目需要,将正点原子开发板的at24c02换成了at24c512,结果读取数据全是0xFF,经过网上的资料发现是读的驱 ...

  5. jsp 图片上传到oracle,jsp上传图片到数据库(oracle),并能在页面上显示解决办法

    jsp上传图片到数据库(oracle),并能在页面上显示解决办法 jsp上传图片到数据库(oracle),并能在页面上显示解决办法 日期:2014-05-18 浏览次数:20341 次 jsp上传图片 ...

  6. IE缓存导致数据不能实时更新的解决办法

    查看全文 http://www.taodudu.cc/news/show-5902634.html 相关文章: IE缓存设置问题 清除IE缓存 关于IE缓存所带来的数据不能实时更新的解决办法 解决ie ...

  7. 多线程读取数据库300万数据,写入到redis

    先说一下业务场景. mysql单表300w条的数据,需要读取到rediis中.如果全部采用单线程的话效率过低,无法接受,因此考虑多线程并发处理. 期间踩了好多坑. 小伙伴们应该很好奇效率到底差多少,贴 ...

  8. mysql数据库导入外部数据乱码么_mysql数据库导入数据时出现乱码的解决办法

    MYSQL存储数据乱码 mysql的字符集设置有多个层级,在mysql中存储中文,如果不能正确设置字符集,很容易出现数据乱码.今天就有一个用户反馈他数据库中的数据下午1点多开始出现了乱码.在这里,我分 ...

  9. access数据违反参照完整_access数据库勾选实施参照完整性报错和解决办法

    解决方法是先在有关联的一方表添加相应的记录,然后再于多方表追加或修改对应的记录:又或者只添加或修改为一方表已经存在的关联记录到多方表.当然删除相应的表间关系也可以避免报错,但是这是最糟糕的解决办法,因 ...

最新文章

  1. VMware Workstation 与 Device/Credential Guard 不兼容
  2. PPIO 商业化架构解析
  3. python和java哪个-Python与Java-你首选哪个?
  4. Java实现双向链表
  5. SVN 图标和工具、wc.db学习
  6. 只运行一个实例的方法
  7. InstallShild的研究,msde2000,.netframwork,ScriptProject与ScriiptMSIProject的区别
  8. 现实版“神笔马良”!“90后”小伙把贫困村画成网红景点!
  9. 性能提升一个数量级,大杀器来了!| 文内福利
  10. RestTemplate异常no suitable HttpMessageConverter found for request type [java.lang.Integer]
  11. 强大的日志分析工具AWStats
  12. mysql 系统变量_MySQL系统变量(查看和修改)
  13. python3如何安装numpy_python3怎么安装numpy
  14. win10 Delphi7 Help帮助文档的安装
  15. 软件推荐,强力卸载软件geek uninstaller
  16. 手动实现直方图匹配(python)
  17. win10忘记密码,重装系统
  18. 解决 WKWebView goback执行无效的bug
  19. The VPN client agent was unable to create the interprocess communication depot.关于win10安装vpn报错的问题
  20. 客户贷后还款提醒优化项目

热门文章

  1. mysql64如何配置_win7 64位下如何安装配置mysql-winx64(安装记录)
  2. Dokcer启动2个mysql容器
  3. 1 用python进行OpenCV实战之用OpenCV3实现图片载入、显示和储存
  4. 正则语法完全正则表达式手册_语法格式重点
  5. LeetCode简单题之在区间范围内统计奇数数目
  6. Arm Cortex-M3 MCU性能
  7. FFmpeg扩展开发
  8. 2021年大数据Kafka(四):❤️kafka的shell命令使用❤️
  9. 2021年大数据常用语言Scala(八):基础语法学习 循环
  10. Ipython的Window与Linux详细安装