Tôi không đồng ý với Ricka về điều này. Các lệnh Async DB không chỉ tốt mà còn rất quan trọng trong việc đạt được quy mô, thông lượng và độ trễ. Sự phản đối của anh ấy về thời gian tăng tốc của nhóm luồng chỉ áp dụng cho một máy chủ web có lưu lượng truy cập thấp.
Trong tình huống lưu lượng truy cập cao (đó là điều duy nhất quan trọng), nhóm chủ đề sẽ không phải chờ 'tiêm' các chủ đề mới. Thực hiện không đồng bộ các Lệnh SQL không chỉ quan trọng từ quan điểm về tình trạng yêu cầu / luồng của máy chủ web mà còn từ quan điểm về tổng thời gian tồn tại / độ trễ của yêu cầu:các lệnh gọi DB không liên quan có thể được thực hiện song song, trái ngược với tuần tự. Điều này thường dẫn đến những cải thiện đáng kể về độ trễ của yêu cầu HTTP mà người dùng đã trải qua. Nói cách khác, các trang của bạn tải nhanh hơn.
Tuy nhiên, một lời khuyên:SQL Command không thực sự không đồng bộ cho đến khi bạn bật Asynchronous Processing=true
trên chuỗi kết nối. Mặc dù điều này không được đặt (và theo mặc định thì không, Chỉnh sửa:bắt đầu với .NET Framework <4.5. Asynchronous Processing
không còn cần thiết
) lệnh gọi 'asyncronous' của bạn tới BeginExecuteReader
không có gì khác ngoài một trò giả mạo, cuộc gọi sẽ khởi chạy một chuỗi và chặn that chủ đề. Khi bật xử lý không đồng bộ thực sự trong chuỗi kết nối thì cuộc gọi thực sự không đồng bộ và cuộc gọi lại dựa trên sự hoàn thành IO.
Một lời cảnh báo:lệnh SQL không đồng bộ sẽ hoàn thành ngay sau lần đầu tiên kết quả trả về máy khách và kết quả là các tin nhắn thông tin được tính.
create procedure usp_DetailsTagsGetAllFromApprovedPropsWithCount
as
begin
print 'Hello';
select complex query;
end
Bạn đã mất tất cả các lợi ích của async. print
tạo ra một kết quả được gửi lại cho máy khách, kết quả này sẽ hoàn thành lệnh không đồng bộ và việc thực thi trên máy khách sẽ tiếp tục và tiếp tục với 'reader.Read ()'. Bây giờ đó sẽ chặn cho đến khi truy vấn phức tạp bắt đầu tạo ra kết quả. Bạn hỏi 'ai đặt print
trong thủ tục? ' nhưng print
có thể được ngụy trang bằng thứ gì đó khác, có thể là thứ gì đó trông vô tội như một INSERT
thực thi mà không lần đầu tiên phát hành SET NOCOUNT ON
.