Sau câu hỏi này, nó làm tôi thoải mái khi sử dụng các hoạt động async trong ASP.NET MVC. Vì vậy, tôi đã viết hai bài đăng trên blog về điều đó:
Tôi có quá nhiều hiểu lầm trong đầu về các hoạt động không đồng bộ trên ASP.NET MVC.
Tôi luôn nghe câu này: Ứng dụng có thể mở rộng tốt hơn nếu các hoạt động chạy không đồng bộ
Và tôi cũng đã nghe loại câu này rất nhiều: nếu bạn có lưu lượng lớn, bạn có thể không thực hiện các truy vấn của mình một cách không đồng bộ - tiêu thụ thêm 2 luồng cho dịch vụ, một yêu cầu sẽ lấy tài nguyên khỏi các yêu cầu đến khác.
Tôi nghĩ rằng hai câu đó không nhất quán.
Tôi không có nhiều thông tin về cách hoạt động của threadpool trên ASP.NET nhưng tôi biết rằng threadpool có kích thước giới hạn cho các luồng. Vì vậy, câu thứ hai phải liên quan đến vấn đề này.
Và tôi muốn biết nếu các hoạt động không đồng bộ trong ASP.NET MVC sử dụng một luồng từ ThreadPool trên .NET 4?
Ví dụ: khi chúng tôi triển khai AsyncControll, ứng dụng sẽ cấu trúc như thế nào? Nếu tôi nhận được lưu lượng truy cập lớn, đó có phải là một ý tưởng tốt để triển khai AsyncControll không?
Có ai ngoài kia có thể gỡ tấm màn đen này ra trước mắt tôi và giải thích cho tôi thỏa thuận về sự không đồng bộ trên ASP.NET MVC 3 (NET 4) không?
Biên tập:
Tôi đã đọc tài liệu dưới đây gần hàng trăm lần và tôi hiểu thỏa thuận chính nhưng tôi vẫn bối rối vì có quá nhiều bình luận không nhất quán ngoài kia.
Sử dụng bộ điều khiển không đồng bộ trong ASP.NET MVC
Biên tập:
Giả sử tôi có hành động điều khiển như bên dưới (không phải là triển khai AsyncController
mặc dù):
public ViewResult Index() {
Task.Factory.StartNew(() => {
//Do an advanced looging here which takes a while
});
return View();
}
Như bạn thấy ở đây, tôi bắn một hoạt động và quên nó đi. Sau đó, tôi trở lại ngay lập tức mà không chờ đợi nó được hoàn thành.
Trong trường hợp này, điều này có phải sử dụng một chủ đề từ threadpool không? Nếu vậy, sau khi nó hoàn thành, điều gì xảy ra với chủ đề đó? Có GC
đến và dọn dẹp ngay sau khi nó hoàn thành?
Biên tập:
Đối với câu trả lời của @ Darin, đây là một mẫu mã async nói về cơ sở dữ liệu:
public class FooController : AsyncController {
//EF 4.2 DbContext instance
MyContext _context = new MyContext();
public void IndexAsync() {
AsyncManager.OutstandingOperations.Increment(3);
Task<IEnumerable<Foo>>.Factory.StartNew(() => {
return
_context.Foos;
}).ContinueWith(t => {
AsyncManager.Parameters["foos"] = t.Result;
AsyncManager.OutstandingOperations.Decrement();
});
Task<IEnumerable<Bars>>.Factory.StartNew(() => {
return
_context.Bars;
}).ContinueWith(t => {
AsyncManager.Parameters["bars"] = t.Result;
AsyncManager.OutstandingOperations.Decrement();
});
Task<IEnumerable<FooBar>>.Factory.StartNew(() => {
return
_context.FooBars;
}).ContinueWith(t => {
AsyncManager.Parameters["foobars"] = t.Result;
AsyncManager.OutstandingOperations.Decrement();
});
}
public ViewResult IndexCompleted(
IEnumerable<Foo> foos,
IEnumerable<Bar> bars,
IEnumerable<FooBar> foobars) {
//Do the regular stuff and return
}
}