Winform 的一个多线程绑定DataGrid数据源的例子
生活随笔
收集整理的這篇文章主要介紹了
Winform 的一个多线程绑定DataGrid数据源的例子
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
我們都知道簡單的運用多線程的方法有
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程序下我們經常遇到在做查詢的時候,當查詢數據特別多的時候就會出現界面停滯的現象,不能做任何其他事情,只能等待這個查詢完成;這時我們自然想到了要運用多線程技術;來解決這個問題
我的代碼結構是
dbmanager.readTable(string table,string express):DataTable?查詢數據庫返回一個DataTable(時間就浪費在這里);
QueryFrm?查詢窗體 有一些條件的輸入,還有一個DataGrid做現實
一般的做法
private void Query()
{
??? string express =" where 1=1";
??? DataTable dt=dbmanager.ReadTable("table",express);
??? dataGrid.DataSource=dt;
}
嘗試用委托來做
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);//這種做法會報錯,提示+?ex?{"Controls created on one thread cannot be parented to a control on a different thread." }?System.Exception
}
}
這種錯誤網上一查多的是網上也有多說法,
有人可能會想到使用窗體的BeginInvoke來調用,后來發現這種做法是并不能做到異步調用,仍然會造成死機的現象
后來我找一個變通的方法
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;
}
????
這樣就解決了窗體死機的現象;
如果大家還有更好的方法,我們一起討論
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程序下我們經常遇到在做查詢的時候,當查詢數據特別多的時候就會出現界面停滯的現象,不能做任何其他事情,只能等待這個查詢完成;這時我們自然想到了要運用多線程技術;來解決這個問題
我的代碼結構是
dbmanager.readTable(string table,string express):DataTable?查詢數據庫返回一個DataTable(時間就浪費在這里);
QueryFrm?查詢窗體 有一些條件的輸入,還有一個DataGrid做現實
一般的做法
private void Query()
{
??? string express =" where 1=1";
??? DataTable dt=dbmanager.ReadTable("table",express);
??? dataGrid.DataSource=dt;
}
嘗試用委托來做
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);//這種做法會報錯,提示+?ex?{"Controls created on one thread cannot be parented to a control on a different thread." }?System.Exception
}
}
這種錯誤網上一查多的是網上也有多說法,
有人可能會想到使用窗體的BeginInvoke來調用,后來發現這種做法是并不能做到異步調用,仍然會造成死機的現象
后來我找一個變通的方法
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;
}
????
這樣就解決了窗體死機的現象;
如果大家還有更好的方法,我們一起討論
總結
以上是生活随笔為你收集整理的Winform 的一个多线程绑定DataGrid数据源的例子的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OJ1079: a+b(多实例测试2)(
- 下一篇: 通用的N-Tier模型合理么?