.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キーワードをヒットすると、操作ステータスに関係なく、すぐに呼び出し元に戻ります。終了すると、戻ってきて継続コードを起動します。
これが私が考えていることです。