c#異步讀取數(shù)據(jù)庫與異步更新ui的代碼實(shí)現(xiàn)
異步讀取數(shù)據(jù)庫,在數(shù)據(jù)綁定的時(shí)候會(huì)出現(xiàn)點(diǎn)問題,就是窗體界面會(huì)無法關(guān)閉,要結(jié)束任務(wù)才能結(jié)束進(jìn)程。例如下面代碼
首先按習(xí)慣的方法,設(shè)定線程更新UI
a2.CheckForIllegalCrossThreadCalls = false; //a2為窗體名稱
下面的代碼就是從數(shù)據(jù)庫里取得數(shù)據(jù)并綁定
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("程序發(fā)生錯(cuò)誤,信息: " + 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; //綁定數(shù)據(jù)
}
}
到這里完成的綁定的工作,運(yùn)行查看一下效果,其實(shí)這樣是會(huì)出現(xiàn)窗體假死的現(xiàn)象。
下面通過Invoke 來實(shí)現(xiàn)
首先聲明委托 public delegate void updateDG(DataTable dt);
然后通過dataBin來綁定DataGridView
public void dataBin(DataTable dt)
{
dataGridView1.DataSource = dt;
return;
}
在線程里面調(diào)用下面方法
//綁定數(shù)據(jù)
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("程序發(fā)生錯(cuò)誤,信息: " + 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;//綁定數(shù)據(jù)
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;
}
查運(yùn)行查看一下,你就會(huì)發(fā)現(xiàn)結(jié)果了
相關(guān)文章
C#三種判斷數(shù)據(jù)庫中取出的字段值是否為空(NULL) 的方法
最近操作數(shù)據(jù)庫,需要判斷返回的字段值是否為空,在網(wǎng)上收集了3種方法供大家參考2013-04-04WPF中下拉框可作選擇項(xiàng)也可以作為只讀文本框使用的方法
這篇文章主要給大家介紹了關(guān)于WPF中下拉框可以選擇項(xiàng)也可以作為只讀文本框使用的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2023-02-02C#編程實(shí)現(xiàn)Excel文檔中搜索文本內(nèi)容的方法及思路
有了在Word文檔中編程實(shí)現(xiàn)搜索文本的經(jīng)驗(yàn),在Excel中實(shí)現(xiàn)這個(gè)功能也并非難事。2013-07-07C# Winform調(diào)用百度接口實(shí)現(xiàn)人臉識(shí)別教程(附源碼)
這篇文章主要介紹了C# Winform調(diào)用百度接口實(shí)現(xiàn)人臉識(shí)別教程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05C# TreeView讀取數(shù)據(jù)庫簡(jiǎn)單實(shí)例
這篇文章主要介紹了2013-12-12Unity輸出帶點(diǎn)擊跳轉(zhuǎn)功能的Log實(shí)現(xiàn)技巧詳解
這篇文章主要為大家介紹了Unity輸出帶點(diǎn)擊跳轉(zhuǎn)功能的Log實(shí)現(xiàn)技巧詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11