C# 异步读取数据库里面的数据与绑定UI的解决办法
异步读取数据库,在数据绑定的时候会出现点问题,就是窗体界面会无法关闭,要结束任务才能结束进程。例如下面代码
首先按习惯的方法,设定线程更新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的解决办法相关推荐
- asp.net中读取数据库中的数据可以使用DataReader和DataSet 2种方式(初学者望大家不要笑我)...
在asp.net中,读取数据库中的数据可以使用DataReader和DataSet 2种方式, 两者的差异如下: 使用Dataset对象读取数据大致需要以下5个步骤: (1)建立数据库 ...
- 数据库锁表及阻塞的原因和解决办法
数据库锁表及阻塞的原因和解决办法 问题说明 当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况.若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性.加锁是 ...
- 串口发数据到android数据错误,51单片机通过蓝牙串口模块发送JSON数据给安卓手机故障解决办法...
原标题:51单片机通过蓝牙串口模块发送JSON数据给安卓手机故障解决办法 JSON(Java Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式.它基于 ECMA (欧洲计 ...
- 对于stm32F103芯片读AT24C512得到的数据全是0xFF的解决办法
对于stm32F103芯片读AT24C512得到的数据全是0xFF的解决办法 由于项目需要,将正点原子开发板的at24c02换成了at24c512,结果读取数据全是0xFF,经过网上的资料发现是读的驱 ...
- jsp 图片上传到oracle,jsp上传图片到数据库(oracle),并能在页面上显示解决办法
jsp上传图片到数据库(oracle),并能在页面上显示解决办法 jsp上传图片到数据库(oracle),并能在页面上显示解决办法 日期:2014-05-18 浏览次数:20341 次 jsp上传图片 ...
- IE缓存导致数据不能实时更新的解决办法
查看全文 http://www.taodudu.cc/news/show-5902634.html 相关文章: IE缓存设置问题 清除IE缓存 关于IE缓存所带来的数据不能实时更新的解决办法 解决ie ...
- 多线程读取数据库300万数据,写入到redis
先说一下业务场景. mysql单表300w条的数据,需要读取到rediis中.如果全部采用单线程的话效率过低,无法接受,因此考虑多线程并发处理. 期间踩了好多坑. 小伙伴们应该很好奇效率到底差多少,贴 ...
- mysql数据库导入外部数据乱码么_mysql数据库导入数据时出现乱码的解决办法
MYSQL存储数据乱码 mysql的字符集设置有多个层级,在mysql中存储中文,如果不能正确设置字符集,很容易出现数据乱码.今天就有一个用户反馈他数据库中的数据下午1点多开始出现了乱码.在这里,我分 ...
- access数据违反参照完整_access数据库勾选实施参照完整性报错和解决办法
解决方法是先在有关联的一方表添加相应的记录,然后再于多方表追加或修改对应的记录:又或者只添加或修改为一方表已经存在的关联记录到多方表.当然删除相应的表间关系也可以避免报错,但是这是最糟糕的解决办法,因 ...
最新文章
- VMware Workstation 与 Device/Credential Guard 不兼容
- PPIO 商业化架构解析
- python和java哪个-Python与Java-你首选哪个?
- Java实现双向链表
- SVN 图标和工具、wc.db学习
- 只运行一个实例的方法
- InstallShild的研究,msde2000,.netframwork,ScriptProject与ScriiptMSIProject的区别
- 现实版“神笔马良”!“90后”小伙把贫困村画成网红景点!
- 性能提升一个数量级,大杀器来了!| 文内福利
- RestTemplate异常no suitable HttpMessageConverter found for request type [java.lang.Integer]
- 强大的日志分析工具AWStats
- mysql 系统变量_MySQL系统变量(查看和修改)
- python3如何安装numpy_python3怎么安装numpy
- win10 Delphi7 Help帮助文档的安装
- 软件推荐,强力卸载软件geek uninstaller
- 手动实现直方图匹配(python)
- win10忘记密码,重装系统
- 解决 WKWebView goback执行无效的bug
- The VPN client agent was unable to create the interprocess communication depot.关于win10安装vpn报错的问题
- 客户贷后还款提醒优化项目