异步可并发的SqlCommand.BeginExecuteReader 和SqlCommand.BeginExecuteNonQuery 方法

首先是 SqlCommand.BeginExecuteReader: string connectionString = GetConnectionString();//在应用内部取得自适应的连接字符串,获取主机名,密码等
             using (SqlConnection connection = new SqlConnection(connectionString))
             {
                 try
                 {                     //对于给定的queryString和 connection,我们要获得command对象 
                     SqlCommand command = new SqlCommand(queryString, connection); 
                     connection.Open();                     //最精彩的地方:开始异步执行,这个任务已经具备了并发能力了  
                     IAsyncResult result = command.BeginExecuteReader();
                     while (!result.IsCompleted) //轮询result
                     {
                         System.Threading.Thread.Sleep(100);
                     }
                     using (SqlDataReader reader = command.EndExecuteReader(result)) //通过轮询的result,再结束操作
                     {                         //将reader转化为DataTable,这是因为reader在connection结束后就不存在了 
                         DataTable dt = new DataTable();
                         dt.Load(reader);
                         return dt;
                     }
                 }
                 catch (SqlException ex)
                 {
                     return null;
                 }
                 catch (InvalidOperationException ex)
                 {
                     return null;
                 }
                 catch (Exception ex)
                 {
                     return null;
                 }
 
                 finally
                 {
                     connection.Close();
                 }
             }
然后是SqlCommand.BeginExecuteNonQuery:
 string connectionString = GetConnectionString();
             using (SqlConnection connection = new SqlConnection(connectionString))
             {
                 try
                 {
                     SqlCommand command = new SqlCommand(queryString, connection);
                     connection.Open();
                     IAsyncResult result = command.BeginExecuteNonQuery(); 
                     while (!result.IsCompleted)
                     {
                         System.Threading.Thread.Sleep(100);
                     }                     //也是result 
                     return command.EndExecuteNonQuery(result); //返回影响的行数,失败则为 -1
                 }
                 catch (SqlException ex)
                 {
                     return -1;
                 }
                 catch (InvalidOperationException ex)
                 {
                     return -1;
                 }
                 catch (Exception ex)
                 {
                     return -1;
                 }
                 finally
                 {
                     connection.Close();
                 }
             }  非常精彩的IAsyncResult,具有无与伦比的魔力。异步且并发。

posted on 2013-05-19 23:43  徐龠  阅读(1153)  评论(2)    收藏  举报

导航