web-dev-qa-db-ja.com

C#AsyncCTPからExecuteReaderAsyncを使用することの欠点

非同期データベース呼び出しが.NETで悪い考えであることを示すいくつかの記事があります。

C#非同期CTPには、System.Data.SqlClient.SqlCommand拡張子はExecuteReaderAsyncと呼ばれます。私は私の既存のコードに以下のようないくつかの操作があります:

var connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["hubConnectionString"].ConnectionString;

using (var conn = new SqlConnection(connectionString)) {
    using (var cmd = new SqlCommand()) {

        cmd.Connection = conn;
        cmd.CommandText = "sp$DetailsTagsGetAllFromApprovedPropsWithCount";
        cmd.CommandType = System.Data.CommandType.StoredProcedure;

        conn.Open();

        var reader = cmd.ExecuteReader();
        while (reader.Read()) {

            //do the reading

        }

        conn.Close();
    }
}

私のコードには、このようないくつかの操作があります。だから、私はそれらを非同期に変換することについて考えています。

しかし、その一方で、私はこのアプローチにあまり魅力を感じていません(多分私は正しい方向を見ていません、誰が知っているのでしょう!)。

それで、この新しい非同期プログラミングモデルをここで使用することの欠点はありますか?

編集:

以下のようにコードをリファクタリングするとします:

public async Task<IEnumerable<Foo>> GetDataAsync() { 

    List<Foo> foos = new List<Foo>();

    var connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["hubConnectionString"].ConnectionString;

    using (var conn = new SqlConnection(connectionString)) {
        using (var cmd = new SqlCommand()) {

            cmd.Connection = conn;
            cmd.CommandText = "sp$DetailsTagsGetAllFromApprovedPropsWithCount";
            cmd.CommandType = System.Data.CommandType.StoredProcedure;

            conn.Open();

            var reader = await cmd.ExecuteReaderAsync();
            while (reader.Read()) {

                //do the reading
                //create foos

            }

            conn.Close();
        }
    }

    return foos;

}

私がawaitキーワードから理解する限り、それは継続として、それ以降のコードを変換します。また、awaitキーワードに到達すると、操作ステータスに関係なく、呼び出し元にすぐに戻ります。それが完了すると、それは戻ってきて、継続コードを起動します。

これは私が考えていることです。

32
tugberk

次の質問が回答されていないことに気づきました。

では、この新しい非同期プログラミングモデルをここで使用することの欠点はありますか?

不利な点これは非常に最小限(マイナーCPU /マイナーメモリアフェイク)であり、コードの可能性があるためです。 awaitステートメントの後に実行may別のスレッドで実行すると、現在実行中のスレッドの状態を格納するステートマシンが存在するため、作業の継続を別のスレッドで処理できます。詳細については、Dixinのブログの await/asyncステートマシン-C#の理解async/await(1)コンパイル を参照してください。

0
Erik Philips