异步可并发的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,具有无与伦比的魔力。异步且并发。
浙公网安备 33010602011771号