Setelah pertanyaan ini, saya merasa nyaman saat menggunakan operasi async di ASP.NET MVC. Jadi, saya menulis dua posting blog tentang itu:
Saya memiliki terlalu banyak kesalahpahaman dalam pikiran saya tentang operasi asinkron di ASP.NET MVC.
Saya selalu mendengar kalimat ini: Aplikasi dapat meningkatkan skala jika operasi berjalan secara tidak sinkron
Dan saya sering mendengar kalimat semacam ini: jika Anda memiliki volume lalu lintas yang besar, Anda mungkin lebih baik tidak melakukan pertanyaan secara tidak sinkron - mengonsumsi 2 utas tambahan untuk melayani satu permintaan mengambil sumber daya dari permintaan masuk lainnya.
Saya pikir kedua kalimat itu tidak konsisten.
Saya tidak memiliki banyak informasi tentang cara kerja threadpool di ASP.NET tetapi saya tahu bahwa threadpool memiliki ukuran terbatas untuk utas. Jadi, kalimat kedua harus terkait dengan masalah ini.
Dan saya ingin tahu apakah operasi asinkron dalam ASP.NET MVC menggunakan utas dari ThreadPool di .NET 4?
Misalnya, ketika kita menerapkan AsyncController, bagaimana struktur aplikasi? Jika saya mendapatkan traffic yang besar, apakah itu ide yang baik untuk mengimplementasikan AsyncController?
Apakah ada orang di luar sana yang dapat mengambil tirai hitam ini di depan mata saya dan menjelaskan kepada saya kesepakatan tentang asinkron di ASP.NET MVC 3 (NET 4)?
Edit:
Saya telah membaca dokumen di bawah ini hampir ratusan kali dan saya mengerti masalah utamanya tetapi saya masih bingung karena terlalu banyak komentar yang tidak konsisten di luar sana.
Menggunakan Asynchronous Controller di ASP.NET MVC
Edit:
Mari kita asumsikan saya memiliki aksi controller seperti di bawah ini (bukan implementasi dari AsyncController
olah):
public ViewResult Index() {
Task.Factory.StartNew(() => {
//Do an advanced looging here which takes a while
});
return View();
}
Seperti yang Anda lihat di sini, saya menjalankan operasi dan melupakannya. Kemudian, saya segera kembali tanpa menunggu itu selesai.
Dalam hal ini, apakah ini harus menggunakan utas dari threadpool? Jika demikian, setelah selesai, apa yang terjadi pada utas itu? Apakah GC
masuk dan membersihkan setelah selesai?
Edit:
Untuk jawaban @ Darwin, berikut adalah contoh kode async yang berbicara ke basis data:
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
}
}