หลังจากคำถามนี้ทำให้ฉันรู้สึกสบายใจเมื่อใช้การดำเนินการ async ใน ASP.NET MVC ดังนั้นฉันจึงเขียนบล็อกโพสต์สองข้อความว่า:
ฉันมีความเข้าใจผิดในใจเกี่ยวกับการทำงานแบบอะซิงโครนัสบน ASP.NET MVC มากเกินไป
ฉันมักจะได้ยินประโยคนี้: แอปพลิเคชันสามารถปรับขนาดได้ดีขึ้นหากการดำเนินการแบบอะซิงโครนัส
และฉันก็ได้ยินประโยคแบบนี้มากมายเช่นกัน: ถ้าคุณมีปริมาณการใช้ข้อมูลจำนวนมากคุณอาจจะดีกว่าถ้าคุณไม่ตอบแบบสอบถามแบบอะซิงโครนัสโดยใช้เธรดพิเศษ 2 เธรดในการให้บริการหนึ่งคำขอ
ฉันคิดว่าทั้งสองประโยคนั้นไม่สอดคล้องกัน
ฉันไม่มีข้อมูลมากนักเกี่ยวกับการทำงานของ threadpool บน ASP.NET แต่ฉันรู้ว่า threadpool นั้นมีขนาดที่ จำกัด สำหรับเธรด ดังนั้นประโยคที่สองจะต้องเกี่ยวข้องกับปัญหานี้
และฉันต้องการทราบว่าการดำเนินการแบบอะซิงโครนัสใน ASP.NET MVC ใช้เธรดจาก ThreadPool บน. NET 4 หรือไม่
ตัวอย่างเช่นเมื่อเราใช้ AsyncController โครงสร้างของแอพจะเป็นอย่างไร? ถ้าฉันได้รับปริมาณการใช้งานมากเป็นความคิดที่ดีที่จะใช้ AsyncController
มีใครบ้างไหมที่สามารถดึงม่านสีดำนี้ออกไปต่อหน้าต่อตาฉันและอธิบายข้อตกลงเกี่ยวกับ asynchrony บน ASP.NET MVC 3 (NET 4)
แก้ไข:
ฉันได้อ่านเอกสารด้านล่างนี้เกือบร้อยครั้งแล้วและฉันเข้าใจข้อตกลงหลัก แต่ฉันก็ยังสับสนเพราะมีความคิดเห็นที่ไม่สอดคล้องกันมากเกินไป
การใช้ตัวควบคุมแบบอะซิงโครนัสใน ASP.NET MVC
แก้ไข:
สมมติว่าฉันมีการกระทำของคอนโทรลเลอร์ดังด้านล่าง (ไม่ใช่การนำไปปฏิบัติAsyncController
)
public ViewResult Index() {
Task.Factory.StartNew(() => {
//Do an advanced looging here which takes a while
});
return View();
}
อย่างที่คุณเห็นที่นี่ฉันทำการผ่าตัดและลืมมันไป จากนั้นฉันกลับมาทันทีโดยไม่ต้องรอให้เสร็จ
ในกรณีนี้สิ่งนี้ต้องใช้เธรดจาก threadpool หรือไม่? หากเป็นเช่นนั้นหลังจากเสร็จสิ้นแล้วจะเกิดอะไรขึ้นกับชุดข้อความนั้น เข้าGC
มาและทำความสะอาดหลังจากเสร็จสิ้นหรือไม่
แก้ไข:
สำหรับคำตอบ @ Darin นี่คือตัวอย่างของรหัส async ที่พูดถึงฐานข้อมูล:
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
}
}