有一些文章表明异步数据库调用在 .NET 中是个坏主意。
在 C# Async 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 关键字时,无论操作状态如何,它都会立即返回给调用者。当它完成时,它会返回并触发延续代码。
这就是我的想法。