Có một số bài viết chỉ ra rằng các cuộc gọi cơ sở dữ liệu không đồng bộ là ý tưởng tồi trong .NET.Bất kỳ bất lợi nào khi sử dụng ExecuteReaderAsync từ C# AsyncCTP
On C# Async CTP, có một phần mở rộng System.Data.SqlClient.SqlCommand
gọi ExecuteReaderAsync
. Tôi có một số hoạt động như bên dưới trên mã hiện tại của mình:
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();
}
}
Có một số hoạt động như thế này trên mã của tôi. Vì vậy, tôi đang có suy nghĩ về việc chuyển đổi chúng thành không đồng bộ.
Nhưng mặt khác, tôi không thấy nhiều thu hút về phương pháp tiếp cận này (có thể tôi không nhìn đúng hướng, ai biết!).
Vì vậy, có bất kỳ nhược điểm nào khi sử dụng mô hình lập trình không đồng bộ mới này không?
Edit:
Giả sử tôi Refactor mã như sau:
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;
}
Theo như tôi hiểu từ các từ khóa đang chờ đợi, nó chuyển đổi mã, đó là sau khi nó, làm phần mở rộng. Ngoài ra, khi nó chạm vào từ khóa chờ đợi, nó ngay lập tức trở lại người gọi của nó bất kể trạng thái hoạt động. Khi nó kết thúc, nó quay lại và kích hoạt mã tiếp tục.
Đây là những gì tôi có trong tâm trí.
Mặc dù câu trả lời được chấp nhận là hoàn hảo, tôi muốn thêm ví dụ của mình. Trong trang web của tôi, tôi đã thực hiện tất cả các phương thức hành động như Task và thực hiện tất cả các cuộc gọi db không đồng bộ. Trang web thực sự bắt đầu tải nhanh hơn –