ฉันทำงานผ่านบทความเกี่ยวกับวิธีการควบคุมแบบอะซิงโครนัสใน ASP.NET MVC ( http://visualstudiomagazine.com/articles/2013/07/23/async-actions-in-aspnet-mvc-4.aspx ) และฉันคิดว่า ฉันอาจจะพลาดจุดนี้
ลองใช้วิธีนี้ที่ฉันเขียนซึ่งคล้ายกับตัวอย่างจากบทความ:
[HttpGet]
[AsyncTimeout(8000)]
[HandleError(ExceptionType = typeof(TimeoutException), View = "TimedOut")]
public async Task<ActionResult> Index(CancellationToken cancellationToken)
{
WidgetPageViewModel model = new WidgetPageViewModel()
{
toAdd = new Widget()
};
model.all = await _repo.GetAllAsync(cancellationToken);
return View(model);
}
เมื่อฉันเข้าใจสิ่งต่าง ๆ นี่คือสิ่งที่จะเกิดขึ้นในรันไทม์:
เธรด ASP.NET จะถูกสร้างขึ้นสำหรับคำขอ HTTP ขาเข้า
หัวข้อนี้จะ (มีการทำงานเบื้องต้นที่จำเป็นบางอย่างสันนิษฐาน) เข้าสู่ดัชนีของฉัน () วิธีการด้านบน
การดำเนินการจะไปถึงคำสำคัญ "รอ" และเริ่มกระบวนการเก็บข้อมูลในเธรดอื่น
เธรด "ASP.NET" ดั้งเดิมจะส่งคืนรหัสที่เรียกว่าเมธอดตัวจัดการของฉันพร้อมกับอินสแตนซ์ของคลาส Task เป็นค่าส่งคืน
รหัสโครงสร้างพื้นฐานที่เรียกว่าวิธีการจัดการของฉันจะดำเนินการต่อในเธรด "ASP.NET" ดั้งเดิมจนกว่าจะถึงจุดที่จำเป็นต้องใช้วัตถุ ActionResult จริง (เช่นเพื่อแสดงหน้า)
ผู้เรียกจะเข้าถึงวัตถุนี้โดยใช้สมาชิก Task.Result ซึ่งจะทำให้เกิด (เช่นเธรด "ASP.NET") เพื่อรอเธรดที่สร้างขึ้นโดยนัยในขั้นตอน # 3 ด้านบน
ฉันไม่เห็นสิ่งที่สิ่งนี้สำเร็จเมื่อเทียบกับสิ่งเดียวกันโดยไม่รอ / async ยกเว้นสองสิ่งที่ฉันเห็นว่าเป็นขี้ประติ๋ว:
เธรดผู้โทรและเธรดผู้ทำงานที่สร้างขึ้นโดยการรอคอยสามารถทำงานพร้อมกันเป็นระยะเวลาหนึ่ง (ส่วน "จนถึง" ของ # 5 ด้านบน) ลางสังหรณ์ของฉันคือช่วงเวลานั้นค่อนข้างเล็ก เมื่อโครงสร้างพื้นฐานเรียกใช้เมธอดคอนโทรลเลอร์ฉันคิดว่าโดยทั่วไปแล้วมันต้องการ ActionResult ที่แท้จริงของการเรียกคอนโทรลเลอร์ก่อนที่มันจะทำอะไรได้มากกว่านี้ (ถ้ามี)
มีโครงสร้างพื้นฐานใหม่ที่เป็นประโยชน์บางอย่างที่เกี่ยวข้องกับการหมดเวลาและการยกเลิกการดำเนินงานคอนโทรลเลอร์แบบอะซิงโครนัสที่ใช้เวลานาน
วัตถุประสงค์ของการเพิ่มวิธีการควบคุม async คาดว่าจะทำให้เธรด ASP.NET ผู้ปฏิบัติงานนั้นว่างเพื่อตอบคำขอ HTTP จริง ๆ เธรดเหล่านี้เป็นทรัพยากรที่มี จำกัด น่าเสียดายที่ฉันไม่เห็นว่ารูปแบบที่แนะนำในบทความนั้นทำหน้าที่ช่วยอนุรักษ์กระทู้เหล่านี้อย่างไร และแม้ว่ามันจะเป็นเช่นนั้นและก็ช่วยลดภาระในการจัดการการร้องขอไปยังเธรดที่ไม่ใช่ ASP.NET บางส่วนสิ่งใดที่ทำให้สำเร็จ เธรดที่มีความสามารถในการจัดการการร้องขอ HTTP ที่แตกต่างจากเธรดโดยทั่วไปหรือไม่
Execution will reach the "await" keyword and kick off a data acquisition process on another thread
-- ไม่จำเป็น.async
ไม่ต้องการเธรดอื่น ... มันเป็นความต่อเนื่อง มันสามารถทำได้โดยการจัดเรียงคำแนะนำในหัวข้อเดียวกัน