Winform 的一个多线程绑定DataGrid数据源的例子
生活随笔
收集整理的這篇文章主要介紹了
Winform 的一个多线程绑定DataGrid数据源的例子
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
我們都知道簡(jiǎn)單的運(yùn)用多線(xiàn)程的方法有
1/ Thread thread=new Thread(new StartThread(this.method))
???? thread.start();
2/ define delegate
??? public delegate void MethodDelegate();
????instance delegate
????MethodDelegate md=new????MethodDelegate(this.method)
????md.BeginInvoke();
在winform程序下我們經(jīng)常遇到在做查詢(xún)的時(shí)候,當(dāng)查詢(xún)數(shù)據(jù)特別多的時(shí)候就會(huì)出現(xiàn)界面停滯的現(xiàn)象,不能做任何其他事情,只能等待這個(gè)查詢(xún)完成;這時(shí)我們自然想到了要運(yùn)用多線(xiàn)程技術(shù);來(lái)解決這個(gè)問(wèn)題
我的代碼結(jié)構(gòu)是
dbmanager.readTable(string table,string express):DataTable?查詢(xún)數(shù)據(jù)庫(kù)返回一個(gè)DataTable(時(shí)間就浪費(fèi)在這里);
QueryFrm?查詢(xún)窗體 有一些條件的輸入,還有一個(gè)DataGrid做現(xiàn)實(shí)
一般的做法
private void Query()
{
??? string express =" where 1=1";
??? DataTable dt=dbmanager.ReadTable("table",express);
??? dataGrid.DataSource=dt;
}
嘗試用委托來(lái)做
public? delegate DataTable QueryDelegate(string table,string express);
private void?Query()
{
??? string express =" where 1=1";
??? QueryDelegate querydelegate=new QueryDelegate(dbmanager.ReadTable)
??? querydelegate.BeginInvoke("table",express,new AsyncCallback(QueryCompeled),querydelegate);
}
private void QueryCompeled(IAsyncResult ar)
{
try{
??? QueryDelegate querydelegate=(QueryDelegate)ar.AsyncState;
??? DataTable dt=querydelegate.EndInvoke(ar);
??? dataGrid.DataSource=dt;
}
catch(Exception e)
{
??? Console.Write(e);//這種做法會(huì)報(bào)錯(cuò),提示+?ex?{"Controls created on one thread cannot be parented to a control on a different thread." }?System.Exception
}
}
這種錯(cuò)誤網(wǎng)上一查多的是網(wǎng)上也有多說(shuō)法,
有人可能會(huì)想到使用窗體的BeginInvoke來(lái)調(diào)用,后來(lái)發(fā)現(xiàn)這種做法是并不能做到異步調(diào)用,仍然會(huì)造成死機(jī)的現(xiàn)象
后來(lái)我找一個(gè)變通的方法
public? delegate DataTable QueryDelegate(string table,string express);
public? delegate void QueryCompleted(DataTable dt);
private void?Query()
{
??? string express =" where 1=1";
??? QueryDelegate querydelegate=new QueryDelegate(dbmanager.ReadTable)
??? querydelegate.BeginInvoke("table",express,new AsyncCallback(QueryCompeled),querydelegate);
}
private void QueryCompeled(IAsyncResult ar)
{
??? try{
??????? QueryDelegate querydelegate=(QueryDelegate)ar.AsyncState;
??????? DataTable dt=querydelegate.EndInvoke(ar);
????????object[]?arg=new object[];
????????arg[0]=dt;
????????QueryCompleted qc=new QueryCompleted?(this.BindResult);
??????? this.BeginInvoke(qc,arg);
??? }
??? catch(Exception e)
??? {
??? Console.Write(e)
??? }
}
private void? BindResult(DataTable dt)
{
??? dataGrid.DataSource=dt;
}
????
這樣就解決了窗體死機(jī)的現(xiàn)象;
如果大家還有更好的方法,我們一起討論
1/ Thread thread=new Thread(new StartThread(this.method))
???? thread.start();
2/ define delegate
??? public delegate void MethodDelegate();
????instance delegate
????MethodDelegate md=new????MethodDelegate(this.method)
????md.BeginInvoke();
在winform程序下我們經(jīng)常遇到在做查詢(xún)的時(shí)候,當(dāng)查詢(xún)數(shù)據(jù)特別多的時(shí)候就會(huì)出現(xiàn)界面停滯的現(xiàn)象,不能做任何其他事情,只能等待這個(gè)查詢(xún)完成;這時(shí)我們自然想到了要運(yùn)用多線(xiàn)程技術(shù);來(lái)解決這個(gè)問(wèn)題
我的代碼結(jié)構(gòu)是
dbmanager.readTable(string table,string express):DataTable?查詢(xún)數(shù)據(jù)庫(kù)返回一個(gè)DataTable(時(shí)間就浪費(fèi)在這里);
QueryFrm?查詢(xún)窗體 有一些條件的輸入,還有一個(gè)DataGrid做現(xiàn)實(shí)
一般的做法
private void Query()
{
??? string express =" where 1=1";
??? DataTable dt=dbmanager.ReadTable("table",express);
??? dataGrid.DataSource=dt;
}
嘗試用委托來(lái)做
public? delegate DataTable QueryDelegate(string table,string express);
private void?Query()
{
??? string express =" where 1=1";
??? QueryDelegate querydelegate=new QueryDelegate(dbmanager.ReadTable)
??? querydelegate.BeginInvoke("table",express,new AsyncCallback(QueryCompeled),querydelegate);
}
private void QueryCompeled(IAsyncResult ar)
{
try{
??? QueryDelegate querydelegate=(QueryDelegate)ar.AsyncState;
??? DataTable dt=querydelegate.EndInvoke(ar);
??? dataGrid.DataSource=dt;
}
catch(Exception e)
{
??? Console.Write(e);//這種做法會(huì)報(bào)錯(cuò),提示+?ex?{"Controls created on one thread cannot be parented to a control on a different thread." }?System.Exception
}
}
這種錯(cuò)誤網(wǎng)上一查多的是網(wǎng)上也有多說(shuō)法,
有人可能會(huì)想到使用窗體的BeginInvoke來(lái)調(diào)用,后來(lái)發(fā)現(xiàn)這種做法是并不能做到異步調(diào)用,仍然會(huì)造成死機(jī)的現(xiàn)象
后來(lái)我找一個(gè)變通的方法
public? delegate DataTable QueryDelegate(string table,string express);
public? delegate void QueryCompleted(DataTable dt);
private void?Query()
{
??? string express =" where 1=1";
??? QueryDelegate querydelegate=new QueryDelegate(dbmanager.ReadTable)
??? querydelegate.BeginInvoke("table",express,new AsyncCallback(QueryCompeled),querydelegate);
}
private void QueryCompeled(IAsyncResult ar)
{
??? try{
??????? QueryDelegate querydelegate=(QueryDelegate)ar.AsyncState;
??????? DataTable dt=querydelegate.EndInvoke(ar);
????????object[]?arg=new object[];
????????arg[0]=dt;
????????QueryCompleted qc=new QueryCompleted?(this.BindResult);
??????? this.BeginInvoke(qc,arg);
??? }
??? catch(Exception e)
??? {
??? Console.Write(e)
??? }
}
private void? BindResult(DataTable dt)
{
??? dataGrid.DataSource=dt;
}
????
這樣就解決了窗體死機(jī)的現(xiàn)象;
如果大家還有更好的方法,我們一起討論
總結(jié)
以上是生活随笔為你收集整理的Winform 的一个多线程绑定DataGrid数据源的例子的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: OJ1079: a+b(多实例测试2)(
- 下一篇: 通用的N-Tier模型合理么?