6

良い一日。

汎用リストを使用して、SqlCommand クラスの 3 つのメソッド 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;
    }
}
4

2 に答える 2

9

Asynch パターンに慣れていない場合は、Web 上に多数のチュートリアルと例があります。これは古いですが、まだ関連しています: 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);
于 2012-06-08T17:07:16.927 に答える
1

すぐにブロックする(を呼び出すEndExecuteReader)場合は、の代わりにExecuteReaderBeginExecuteReaderを使用する必要があります。

于 2012-06-08T16:59:03.740 に答える