再会。

请帮我了解如何使用通用列表使用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;
    }
}

最佳答案

如果您不熟悉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



这是代码的相关部分:

            // 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);

关于c# - 如何使用BeginExecuteReader,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10952927/

10-11 15:53