且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

ADO.NET 2.0 数据异步处理改善用户体验

更新时间:2022-09-16 19:03:56


支持异步处理的提供程序有 System.Data.SqlClient
在针对大批量数据插入过更新时,使用异步处理方法可以不用等待多有数据更新完毕才能操作或者进行下步处理,改善了用户体验
  SqlCommand对象方法如下:
  异步方法 BeginExecuteNonQuery   EndExecuteNonQuery
           BeginExecuteXmlReader   EndExecuteXmlReader
           BeginExecuteReader   EndExecuteReader
  begin前缀的方法传入参数,end前缀的方法返回输出参数和返回值
  begin前缀方法返回的是IAsyncResult  用于追踪一步方法的执行状态
   IAsyncResult .AsnycState 用户自定义的状态对象
   IAsyncResult .AsnycWaitHandle 呼叫代码的等待形式,是等其中的一个异步方法完成还是全部完成
   IAsyncResult .CompletedSynchronously  获取所有异步方法是否同时完成
   IAsyncResult .Iscompleted 是否执行完毕,可以根据此属性进行下部动作
在连接字符串中加入"async=true"
   如果所有的命令都是同步的建议在连接字符串中显施加入"async=false"
   如果有一部分命令是异步执行,又有一部分是同步同步执行,建议分别建立两个连接对象
   如果"async=true"时,也可以执行同步命令,但是会损失一些资源
ADO.NET 2.0 数据异步处理改善用户体验 //// obtain connection strings from configuration files or
ADO.NET 2.0 数据异步处理改善用户体验            
//// similar facility
ADO.NET 2.0 数据异步处理改善用户体验            
//// NOTE: these connection strings have to include "async=true", for
ADO.NET 2.0 数据异步处理改善用户体验            
//// example: 
ADO.NET 2.0 数据异步处理改善用户体验            
//// "server=myserver;database=mydb;integrated security=true;async=true"

ADO.NET 2.0 数据异步处理改善用户体验            //string connstrAccouting = GetConnString("accounting");
ADO.NET 2.0 数据异步处理改善用户体验            
//string connstrHR = GetConnString("humanresources");
ADO.NET 2.0 数据异步处理改善用户体验
            //// define two connection objects, one for each database
ADO.NET 2.0 数据异步处理改善用户体验            //using (SqlConnection connAcc = new SqlConnection(connstrAccounting))
ADO.NET 2.0 数据异步处理改善用户体验            
//using (SqlConnection connHumanRes = new SqlConnection(connstrHR))
ADO.NET 2.0 数据异步处理改善用户体验            
//{
ADO.NET 2.0 数据异步处理改善用户体验            
//    // open the first connection
ADO.NET 2.0 数据异步处理改善用户体验            
//    connAcc.Open();
ADO.NET 2.0 数据异步处理改善用户体验            
//    // start the execution of the first query contained in the
ADO.NET 2.0 数据异步处理改善用户体验            
//    // "employee_info" stored-procedure
ADO.NET 2.0 数据异步处理改善用户体验            
//    SqlCommand cmdAcc = new SqlCommand("employee_info", connAcc);
ADO.NET 2.0 数据异步处理改善用户体验            
//    cmdAcc.CommandType = CommandType.StoredProcedure;
ADO.NET 2.0 数据异步处理改善用户体验            
//    cmdAcc.Parameters.AddWithValue("@empl_id", employee_id);
ADO.NET 2.0 数据异步处理改善用户体验            
//    IAsyncResult arAcc = cmdAcc.BeginExecuteReader();
ADO.NET 2.0 数据异步处理改善用户体验            
//    // at this point, the "employee_info" stored-proc is executing on
ADO.NET 2.0 数据异步处理改善用户体验            
//    // the server, and this thread is running at the same time
ADO.NET 2.0 数据异步处理改善用户体验            
//    // now open the second connection
ADO.NET 2.0 数据异步处理改善用户体验            
//    connHumanRes.Open();
ADO.NET 2.0 数据异步处理改善用户体验            
//    // start the execution of the second stored-proc against
ADO.NET 2.0 数据异步处理改善用户体验            
//    // the human-resources server
ADO.NET 2.0 数据异步处理改善用户体验            
//    SqlCommand cmdHumanRes = new SqlCommand("employee_hrinfo",
ADO.NET 2.0 数据异步处理改善用户体验            
//                                            connHumanRes);
ADO.NET 2.0 数据异步处理改善用户体验            
//    cmdHumanRes.Parameters.AddWithValue("@empl_id", employee_id);
ADO.NET 2.0 数据异步处理改善用户体验            
//    IAsyncResult arHumanRes = cmdHumanRes.BeginExecuteReader();
ADO.NET 2.0 数据异步处理改善用户体验            
//    // now both queries are running at the same time
ADO.NET 2.0 数据异步处理改善用户体验            
//    // at this point; more work can be done from this thread, or we
ADO.NET 2.0 数据异步处理改善用户体验            
//    // can simply wait until both commands finish - in our case we'll
ADO.NET 2.0 数据异步处理改善用户体验            
//    // wait
ADO.NET 2.0 数据异步处理改善用户体验            
//    SqlDataReader drAcc = cmdAcc.EndExecuteReader(arAcc);
ADO.NET 2.0 数据异步处理改善用户体验            
//    SqlDataReader drHumanRes = cmdHumanRes.EndExecuteReader(arHumanRes);
ADO.NET 2.0 数据异步处理改善用户体验            
//    // now we can render the results, for example, bind the readers to an ASP.NET
ADO.NET 2.0 数据异步处理改善用户体验            
//    // web control, or scan the reader and draw the information in a 
ADO.NET 2.0 数据异步处理改善用户体验            
//    // WebForms form.
ADO.NET 2.0 数据异步处理改善用户体验            
//}
ADO.NET 2.0 数据异步处理改善用户体验

ADO.NET 2.0 数据异步处理改善用户体验            
string custid = "ALFKI";
ADO.NET 2.0 数据异步处理改善用户体验            
string orderid = "10643";
ADO.NET 2.0 数据异步处理改善用户体验
ADO.NET 2.0 数据异步处理改善用户体验            
// NOTE: connection strings denoted by "connstring" have to include 
ADO.NET 2.0 数据异步处理改善用户体验            
// "async=true", for example: 
ADO.NET 2.0 数据异步处理改善用户体验
            string connstring = "server=(local);database=northwind;integrated security=true;async=true";
ADO.NET 2.0 数据异步处理改善用户体验            
// we'll use three connections for this
ADO.NET 2.0 数据异步处理改善用户体验
            using (SqlConnection c1 = new SqlConnection(connstring))
ADO.NET 2.0 数据异步处理改善用户体验            
using (SqlConnection c2 = new SqlConnection(connstring))
ADO.NET 2.0 数据异步处理改善用户体验            
using (SqlConnection c3 = new SqlConnection(connstring))
ADO.NET 2.0 数据异步处理改善用户体验            
{
ADO.NET 2.0 数据异步处理改善用户体验                
// get customer info
ADO.NET 2.0 数据异步处理改善用户体验
                c1.Open();
ADO.NET 2.0 数据异步处理改善用户体验                SqlCommand cmd1 
= new SqlCommand(
ADO.NET 2.0 数据异步处理改善用户体验                  
"SELECT CustomerID, CompanyName, ContactName FROM Customers WHERE CustomerID=@id", c1);
ADO.NET 2.0 数据异步处理改善用户体验                cmd1.Parameters.Add(
"@id", SqlDbType.Char, 5).Value = custid;
ADO.NET 2.0 数据异步处理改善用户体验                IAsyncResult arCustomer 
= cmd1.BeginExecuteReader();
ADO.NET 2.0 数据异步处理改善用户体验                
// get orders
ADO.NET 2.0 数据异步处理改善用户体验
                c2.Open();
ADO.NET 2.0 数据异步处理改善用户体验                SqlCommand cmd2 
= new SqlCommand("SELECT * FROM Orders WHERE CustomerID=@id", c2);
ADO.NET 2.0 数据异步处理改善用户体验                cmd2.Parameters.Add(
"@id", SqlDbType.Char, 5).Value = custid;
ADO.NET 2.0 数据异步处理改善用户体验                IAsyncResult arOrders 
= cmd2.BeginExecuteReader();
ADO.NET 2.0 数据异步处理改善用户体验                
// get order detail if user picked an order
ADO.NET 2.0 数据异步处理改善用户体验
                IAsyncResult arDetails = null;
ADO.NET 2.0 数据异步处理改善用户体验                SqlCommand cmd3 
= null;
ADO.NET 2.0 数据异步处理改善用户体验                
if (null != orderid)
ADO.NET 2.0 数据异步处理改善用户体验                
{
ADO.NET 2.0 数据异步处理改善用户体验                    c3.Open();
ADO.NET 2.0 数据异步处理改善用户体验                    cmd3 
= new SqlCommand("SELECT * FROM [Order Details] WHERE OrderID=@id", c3);
ADO.NET 2.0 数据异步处理改善用户体验                    cmd3.Parameters.Add(
"@id", SqlDbType.Int).Value = int.Parse(orderid);
ADO.NET 2.0 数据异步处理改善用户体验                    arDetails 
= cmd3.BeginExecuteReader();
ADO.NET 2.0 数据异步处理改善用户体验                }

ADO.NET 2.0 数据异步处理改善用户体验                
// build the wait handle array for WaitForMultipleObjects
ADO.NET 2.0 数据异步处理改善用户体验
                WaitHandle[] handles = new WaitHandle[null == arDetails ? 2 : 3];
ADO.NET 2.0 数据异步处理改善用户体验                handles[
0= arCustomer.AsyncWaitHandle;
ADO.NET 2.0 数据异步处理改善用户体验                handles[
1= arOrders.AsyncWaitHandle;
ADO.NET 2.0 数据异步处理改善用户体验                
if (null != arDetails)
ADO.NET 2.0 数据异步处理改善用户体验                    handles[
2= arDetails.AsyncWaitHandle;
ADO.NET 2.0 数据异步处理改善用户体验                
// wait for commands to complete and render page controls as we 
ADO.NET 2.0 数据异步处理改善用户体验                
// get data back
ADO.NET 2.0 数据异步处理改善用户体验
                SqlDataReader r;
ADO.NET 2.0 数据异步处理改善用户体验                DataTable dt;
ADO.NET 2.0 数据异步处理改善用户体验                
for (int results = (null == arDetails) ? 1 : 0; results < 3; results++)
ADO.NET 2.0 数据异步处理改善用户体验                
{
ADO.NET 2.0 数据异步处理改善用户体验                    
// wait for any handle, then process results as they come
ADO.NET 2.0 数据异步处理改善用户体验
                    int index = WaitHandle.WaitAny(handles, 5000false); // 5 secs
ADO.NET 2.0 数据异步处理改善用户体验
                    if (WaitHandle.WaitTimeout == index)
ADO.NET 2.0 数据异步处理改善用户体验                        
throw new Exception("Timeout");
ADO.NET 2.0 数据异步处理改善用户体验                    
switch (index)
ADO.NET 2.0 数据异步处理改善用户体验                    
{
ADO.NET 2.0 数据异步处理改善用户体验                        
case 0// customer query is ready
ADO.NET 2.0 数据异步处理改善用户体验
                            r = cmd1.EndExecuteReader(arCustomer);
ADO.NET 2.0 数据异步处理改善用户体验                            
if (!r.Read())
ADO.NET 2.0 数据异步处理改善用户体验                                
continue;
ADO.NET 2.0 数据异步处理改善用户体验                            lblCustomerID.Text 
= r.GetString(0);
ADO.NET 2.0 数据异步处理改善用户体验                            lblCompanyName.Text 
= r.GetString(1);
ADO.NET 2.0 数据异步处理改善用户体验                            lblContact.Text 
= r.GetString(2);
ADO.NET 2.0 数据异步处理改善用户体验                            r.Close();
ADO.NET 2.0 数据异步处理改善用户体验                            
break;
ADO.NET 2.0 数据异步处理改善用户体验                        
case 1// orders query is ready
ADO.NET 2.0 数据异步处理改善用户体验
                            r = cmd2.EndExecuteReader(arOrders);
ADO.NET 2.0 数据异步处理改善用户体验                            dt 
= new DataTable();
ADO.NET 2.0 数据异步处理改善用户体验                            dt.Load(r);
ADO.NET 2.0 数据异步处理改善用户体验                            dgOrders.DataSource 
= dt; // data-bind to the orders grid
ADO.NET 2.0 数据异步处理改善用户体验
                            dgOrders.Refresh();
ADO.NET 2.0 数据异步处理改善用户体验                            r.Close();
ADO.NET 2.0 数据异步处理改善用户体验                            
break;
ADO.NET 2.0 数据异步处理改善用户体验                        
case 2// details query is ready
ADO.NET 2.0 数据异步处理改善用户体验
                            r = cmd3.EndExecuteReader(arDetails);
ADO.NET 2.0 数据异步处理改善用户体验                            dt 
= new DataTable();
ADO.NET 2.0 数据异步处理改善用户体验                            dt.Load(r);
ADO.NET 2.0 数据异步处理改善用户体验                            dgDetails.DataSource 
= dt; // data-bind to the details grid
ADO.NET 2.0 数据异步处理改善用户体验
                            dgDetails.Refresh();
ADO.NET 2.0 数据异步处理改善用户体验                            r.Close();
ADO.NET 2.0 数据异步处理改善用户体验                            
break;
ADO.NET 2.0 数据异步处理改善用户体验
ADO.NET 2.0 数据异步处理改善用户体验                    }

ADO.NET 2.0 数据异步处理改善用户体验                }

ADO.NET 2.0 数据异步处理改善用户体验            }



本文转自高海东博客园博客,原文链接:http://www.cnblogs.com/ghd258/archive/2005/10/30/264839.html,如需转载请自行联系原作者