美好的一天。
请帮助我使用Generic Lists如何使用SqlCommand类的三个方法BeginExecuteReader()。我使用BeginExecuteReader创建了一个方法,但我不知道这是否是最好的使用方式
public class Empresa {
public Empresa() {
PkEmpresa = -1;
CodigoEmpresa = "";
Descripcion = "";
PkCategoriaEmpresa = -1;
}
public int PkEmpresa { get; set; }
public string CodigoEmpresa { get; set; }
public string Descripcion { get; set; }
public int PkCategoriaEmpresa { get; set; }
public Empresa ShallowCopy() {
return (Empresa)this.MemberwiseClone();
}
}
public class AsyncronousDAL {
private static string getConexion() {
return "Data Source=DATABASE;Initial Catalog=DATA_BASE;Integrated Security=True;Asynchronous Processing=True";
}
public static List<Empresa> ConsultaAsincrona() {
List<Empresa> _resultados = new List<Empresa>();
using (SqlConnection conexion = new SqlConnection(getConexion())) {
using (SqlCommand commando = new SqlCommand("[dbo].[pruebaAsync]", conexion)) {
commando.CommandType = System.Data.CommandType.StoredProcedure;
conexion.Open();
IAsyncResult resultado = commando.BeginExecuteReader();
using (SqlDataReader reader = commando.EndExecuteReader(resultado)) {
while (reader.Read()) {
_resultados.Add(new Empresa() {
PkEmpresa = Convert.ToInt32(reader["PkEmpresa"]),
CodigoEmpresa = reader["CodigoEmpresa"].ToString(),
Descripcion = reader["Descripcion"].ToString(),
PkCategoriaEmpresa = Convert.ToInt32(reader["PkCategoriaEmpresa"])
});
}
}
}
}
return _resultados;
}
}
答案 0 :(得分:9)
如果您不熟悉Asynch模式,网上有很多教程和示例。这是旧的,但仍然相关:http://msdn.microsoft.com/en-us/library/aa719595(v=vs.71).aspx
当你致电BeginExecuteReader
时,工作将最终被推送到工作线程,允许你的主继续执行。当您调用EndExecuteReader
时,将导致主线程阻塞,直到该任务完成。
如果您立即调用EndExecuteReader - 您实际上没有获得任何好处(实际上,您正在引入额外的开销)。
看一下这里的示例:http://msdn.microsoft.com/en-us/library/7szdt0kc.aspx
BeginExecuteReader方法立即返回,但直到代码 执行相应的EndExecuteReader方法调用,它一定不能 执行任何其他启动同步或异步的调用 对同一个SqlCommand对象执行。打电话给 命令执行完成之前的EndExecuteReader导致 SqlCommand对象要阻塞,直到执行完成。
这是代码的相关部分:
// Although it is not required that you pass the
// SqlCommand object as the second parameter in the
// BeginExecuteReader call, doing so makes it easier
// to call EndExecuteReader in the callback procedure.
AsyncCallback callback = new AsyncCallback(HandleCallback);
command.BeginExecuteReader(callback, command);
答案 1 :(得分:1)
如果您要立即阻止(致电EndExecuteReader
),则应使用ExecuteReader代替BeginExecuteReader
。