代碼分析ADO.NET數(shù)據(jù)異步處理
#T#很多開(kāi)發(fā)語(yǔ)言都支持異步通信,在ADO.NET中支持異步處理的提供程序有System.Data.SqlClient在針對(duì)大批量數(shù)據(jù)插入過(guò)更新時(shí),使用ADO.NET數(shù)據(jù)異步處理方法可以不用等待多有數(shù)據(jù)更新完畢才能操作或者進(jìn)行下步處理,改善了用戶體驗(yàn)SqlCommand對(duì)象方法如下:
ADO.NET數(shù)據(jù)異步處理
◆BeginExecuteNonQueryEndExecuteNonQuery
◆BeginExecuteXmlReaderEndExecuteXmlReader
◆BeginExecuteReaderEndExecuteReader
◆begin前綴的方法傳入?yún)?shù),end前綴的方法返回輸出參數(shù)和返回值
◆begin前綴方法返回的是IAsyncResult用于追蹤一步方法的執(zhí)行狀態(tài)
◆IAsyncResult.AsnycState用戶自定義的狀態(tài)對(duì)象
◆IAsyncResult.AsnycWaitHandle呼叫代碼的等待形式,是等其中的一個(gè)異步方法完成還是全部完成
◆IAsyncResult.CompletedSynchronously獲取所有異步方法是否同時(shí)完成
◆IAsyncResult.Iscompleted是否執(zhí)行完畢,可以根據(jù)此屬性進(jìn)行下部動(dòng)作
在連接字符串中加入"async=true"如果所有的命令都是同步的建議在連接字符串中顯施加入,"async=false"如果有一部分命令是異步執(zhí)行,又有一部分是同步同步執(zhí)行,建議分別建立兩個(gè)連接對(duì)象,如果"async=true"時(shí),也可以執(zhí)行同步命令,但是會(huì)損失一些資源
- /**/////obtainconnectionstringsfromconfigurationfilesor
 - ////similarfacility
 - ////NOTE:theseconnectionstringshavetoinclude"async=true",for
 - ////example:
 - ////"server=myserver;database=mydb;integratedsecurity=true;async=true"
 - //stringconnstrAccouting=GetConnString("accounting");
 - //stringconnstrHR=GetConnString("humanresources");
 - /**/////definetwoconnectionobjects,oneforeachdatabase
 - //using(SqlConnectionconnAcc=newSqlConnection(connstrAccounting))
 - //using(SqlConnectionconnHumanRes=newSqlConnection(connstrHR))
 - //{
 - ////openthefirstconnection
 - //connAcc.Open();
 - ////starttheexecutionofthefirstquerycontainedinthe
 - ////"employee_info"stored-procedure
 - //SqlCommandcmdAcc=newSqlCommand("employee_info",connAcc);
 - //cmdAcc.CommandType=CommandType.StoredProcedure;
 - //cmdAcc.Parameters.AddWithValue("@empl_id",employee_id);
 - //IAsyncResultarAcc=cmdAcc.BeginExecuteReader();
 - ////atthispoint,the"employee_info"stored-procisexecutingon
 - ////theserver,andthisthreadisrunningatthesametime
 - ////nowopenthesecondconnection
 - //connHumanRes.Open();
 - ////starttheexecutionofthesecondstored-procagainst
 - ////thehuman-resourcesserver
 - //SqlCommandcmdHumanRes=newSqlCommand("employee_hrinfo",
 - //connHumanRes);
 - //cmdHumanRes.Parameters.AddWithValue("@empl_id",employee_id);
 - //IAsyncResultarHumanRes=cmdHumanRes.BeginExecuteReader();
 - ////nowbothqueriesarerunningatthesametime
 - ////atthispoint;moreworkcanbedonefromthisthread,orwe
 - ////cansimplywaituntilbothcommandsfinish-inourcasewe'll
 - ////wait
 - //SqlDataReaderdrAcc=cmdAcc.EndExecuteReader(arAcc);
 - //SqlDataReaderdrHumanRes=cmdHumanRes.EndExecuteReader(arHumanRes);
 - ////nowwecanrendertheresults,forexample,bindthereaderstoanASP.NET
 - ////webcontrol,orscanthereaderanddrawtheinformationina
 - ////WebFormsform.
 - //}
 - stringcustid="ALFKI";
 - stringorderid="10643";
 - //NOTE:connectionstringsdenotedby"connstring"havetoinclude
 - //"async=true",forexample:
 - stringconnstring="server=(local);database=northwind;integratedsecurity=true;async=true";
 - //we'llusethreeconnectionsforthis
 - using(SqlConnectionc1=newSqlConnection(connstring))
 - using(SqlConnectionc2=newSqlConnection(connstring))
 - using(SqlConnectionc3=newSqlConnection(connstring))
 - {
 - //getcustomerinfo
 - c1.Open();
 - SqlCommandcmd1=newSqlCommand(
 - "SELECTCustomerID,CompanyName,ContactNameFROMCustomersWHERECustomerID=@id",c1);
 - cmd1.Parameters.Add("@id",SqlDbType.Char,5).Value=custid;
 - IAsyncResultarCustomer=cmd1.BeginExecuteReader();
 - //getorders
 - c2.Open();
 - SqlCommandcmd2=newSqlCommand("SELECT*FROMOrdersWHERECustomerID=@id",c2);
 - cmd2.Parameters.Add("@id",SqlDbType.Char,5).Value=custid;
 - IAsyncResultarOrders=cmd2.BeginExecuteReader();
 - //getorderdetailifuserpickedanorder
 - IAsyncResultarDetails=null;
 - SqlCommandcmd3=null;
 - if(null!=orderid)
 - {
 - c3.Open();
 - cmd3=newSqlCommand("SELECT*FROM[OrderDetails]WHEREOrderID=@id",c3);
 - cmd3.Parameters.Add("@id",SqlDbType.Int).Value=int.Parse(orderid);
 - arDetails=cmd3.BeginExecuteReader();
 - }
 - //buildthewaithandlearrayforWaitForMultipleObjects
 - WaitHandle[]handles=newWaitHandle[null==arDetails?2:3];
 - handles[0]=arCustomer.AsyncWaitHandle;
 - handles[1]=arOrders.AsyncWaitHandle;
 - if(null!=arDetails)
 - handles[2]=arDetails.AsyncWaitHandle;
 - //waitforcommandstocompleteandrenderpagecontrolsaswe
 - //getdataback
 - SqlDataReaderr;
 - DataTabledt;
 - for(intresults=(null==arDetails)?1:0;results<3;results++)
 - {
 - //waitforanyhandle,thenprocessresultsastheycome
 - intindex=WaitHandle.WaitAny(handles,5000,false);//5secs
 - if(WaitHandle.WaitTimeout==index)
 - thrownewException("Timeout");
 - switch(index)
 - {
 - case0://customerqueryisready
 - r=cmd1.EndExecuteReader(arCustomer);
 - if(!r.Read())
 - continue;
 - lblCustomerID.Text=r.GetString(0);
 - lblCompanyName.Text=r.GetString(1);
 - lblContact.Text=r.GetString(2);
 - r.Close();
 - break;
 - case1://ordersqueryisready
 - r=cmd2.EndExecuteReader(arOrders);
 - dt=newDataTable();
 - dt.Load(r);
 - dgOrders.DataSource=dt;//data-bindtotheordersgrid
 - dgOrders.Refresh();
 - r.Close();
 - break;
 - case2://detailsqueryisready
 - r=cmd3.EndExecuteReader(arDetails);
 - dt=newDataTable();
 - dt.Load(r);
 - dgDetails.DataSource=dt;//data-bindtothedetailsgrid
 - dgDetails.Refresh();
 - r.Close();
 - break;
 - }
 - }
 - }
 
以上就是ADO.NET數(shù)據(jù)異步處理用戶體驗(yàn)的一個(gè)解決方案,大家快試試。















 
 
 
 
 
 
 