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;
}
查运行查看一下,你就会发现结果了
上一篇: hibernate中的增删改查实现代码
下一篇: jsp基础速成精华讲解