Bu sorudan sonra, ASP.NET MVC'de zaman uyumsuz işlemler kullanırken rahat etmemi sağlıyor. Bunun üzerine iki blog yazısı yazdım:
ASP.NET MVC'de eşzamansız işlemler hakkında çok fazla yanlış anlama var.
Bu cümleyi her zaman duyuyorum: İşlemler eşzamansız olarak çalışıyorsa uygulama daha iyi ölçeklenebilir
Ben de bu tür cümleler çok duydum: Eğer büyük bir trafik hacminiz varsa, sorgularınızı eşzamansız olarak yerine getirmemek daha iyi olabilir - bir talebe hizmet vermek için 2 ekstra iş parçacığı tüketmek, kaynakları diğer gelen isteklerden uzaklaştırır.
Bence bu iki cümle tutarsız.
Threadpool ASP.NET üzerinde nasıl çalıştığı hakkında çok fazla bilgi yok ama threadpool iş parçacıkları için sınırlı bir boyutu olduğunu biliyorum. Dolayısıyla, ikinci cümlenin bu konuyla ilgili olması gerekir.
Ve ASP.NET MVC zaman uyumsuz işlemleri .NET 4'te ThreadPool bir iş parçacığı kullanıp kullanmadığını bilmek ister misiniz?
Örneğin, bir AsyncController uyguladığımızda uygulama nasıl yapılandırılır? Büyük trafik alırsam, AsyncController'ı uygulamak iyi bir fikir mi?
Dışarıda bu siyah perdeyi gözlerimin önünde alıp ASP.NET MVC 3 (NET 4) üzerindeki eşzamansızlık konusundaki anlaşmayı açıklayabilecek kimse var mı?
Düzenle:
Aşağıdaki belgeyi neredeyse yüzlerce kez okudum ve ana anlaşmayı anlıyorum ama hala karışıklık var çünkü orada çok fazla tutarsız yorum var.
ASP.NET MVC'de Eşzamansız Denetleyici Kullanma
Düzenle:
Diyelim ki aşağıdaki gibi denetleyici eylemim var (bir uygulama değil AsyncController
):
public ViewResult Index() {
Task.Factory.StartNew(() => {
//Do an advanced looging here which takes a while
});
return View();
}
Burada gördüğünüz gibi bir operasyon başlatıyorum ve unutuyorum. Sonra, tamamlanmasını beklemeden hemen dönüyorum.
Bu durumda, bunun threadpool'dan bir iplik kullanması gerekir mi? Eğer öyleyse, tamamlandıktan sonra, bu konuya ne olur? Mu GC
geliyor ve tamamlar hemen sonra temizlemek?
Düzenle:
@ Darin'in cevabı için, veritabanıyla konuşan async kodu örneği:
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
}
}