คุณอาจพบฉันบทความ MSDN ในเรื่องที่เป็นประโยชน์ ; ฉันใช้พื้นที่จำนวนมากในบทความที่อธิบายเมื่อคุณควรใช้async
บน ASP.NET ไม่ใช่แค่วิธีใช้async
บน ASP.NET
ฉันมีข้อกังวลบางอย่างเกี่ยวกับการใช้การกระทำของ async ใน ASP.NET MVC เมื่อมันปรับปรุงประสิทธิภาพของแอพของฉันและเมื่อ - ไม่
ครั้งแรกเข้าใจว่าasync
/ await
คือทั้งหมดที่เกี่ยวกับการพ้นขึ้นหัวข้อ ในแอปพลิเคชัน GUI ส่วนใหญ่เกี่ยวกับการเพิ่มเธรด GUIเพื่อให้ประสบการณ์การใช้งานของผู้ใช้ดีขึ้น บนแอปพลิเคชันเซิร์ฟเวอร์ (รวมถึง ASP.NET MVC) ส่วนใหญ่เกี่ยวกับการเพิ่มเธรดการร้องขอเพื่อให้เซิร์ฟเวอร์สามารถปรับขนาดได้
โดยเฉพาะอย่างยิ่งมันจะไม่:
- ทำให้คำขอของคุณเสร็จสมบูรณ์เร็วขึ้น ในความเป็นจริงพวกเขาจะเสร็จสมบูรณ์ (ช้าลงเล็กน้อย)
- กลับไปที่โทร /
await
เบราว์เซอร์เมื่อคุณตี await
เฉพาะ "อัตราผลตอบแทน" ไปยังพูลเธรด ASP.NET ไม่ใช่เบราว์เซอร์
คำถามแรกคือ - ใช้แอคชั่น async ใน ASP.NET MVC ดีหรือไม่?
ฉันว่ามันดีที่จะใช้ทุกที่ที่คุณทำ I / O มันอาจไม่เป็นประโยชน์แต่ (ดูด้านล่าง)
อย่างไรก็ตามมันไม่ดีที่จะใช้สำหรับวิธีการที่ผูกกับ CPU บางครั้งผู้พัฒนาคิดว่าพวกเขาจะได้รับประโยชน์async
เพียงแค่เรียกผู้Task.Run
ควบคุมของพวกเขาและนี่เป็นความคิดที่น่ากลัว เนื่องจากรหัสนั้นจบลงด้วยการเพิ่มเธรดการร้องขอโดยการเพิ่มเธรดอื่นดังนั้นจึงไม่มีประโยชน์เลย
ฉันจะใช้คำหลักแบบ async / รอคำสั่งเมื่อฉันต้องการสืบค้นฐานข้อมูล (ผ่าน EF / NHibernate / ORM อื่น ๆ ) หรือไม่
คุณสามารถใช้วิธีการใด ๆ ที่คุณมีอยู่ ตอนนี้ผู้เล่นหลักส่วนใหญ่สนับสนุนasync
แต่ก็มีบางอย่างที่ไม่ หากออมของคุณไม่สนับสนุนasync
อย่าพยายามห่อในTask.Run
หรืออะไรทำนองนั้น (ดูด้านบน)
โปรดทราบว่าฉันพูดว่า "คุณสามารถใช้" หากคุณกำลังพูดคุยเกี่ยวกับ ASP.NET MVC กับแบ็กเอนด์ฐานข้อมูลเดียวแล้วคุณ (เกือบจะแน่นอน) จะไม่ได้รับผลประโยชน์ใด ๆ async
จากการขยายขีดความสามารถ นี่เป็นเพราะ IIS สามารถจัดการการร้องขอพร้อมกันได้มากกว่าอินสแตนซ์เดียวของเซิร์ฟเวอร์ SQL (หรือ RDBMS แบบดั้งเดิมอื่น ๆ ) แต่ถ้าแบ็กเอนด์ของคุณมีความทันสมัยมากขึ้น - เซิร์ฟเวอร์คลัสเตอร์ของ SQL Azure SQL, NoSQL ฯลฯ - และแบ็กเอนด์ของคุณสามารถปรับขนาดและความยืดหยุ่นคอขวดของคุณเป็นของ IIS แล้วasync
คุณจะได้รับประโยชน์จากความยืดหยุ่น
คำถามที่สาม - ฉันสามารถใช้คำหลักที่รอคอยเพื่อค้นหาฐานข้อมูลแบบอะซิงโครนัสในวิธีการเดียวได้กี่ครั้ง
มากเท่าที่คุณต้องการ อย่างไรก็ตามโปรดทราบว่าหลาย ORMs มีกฎหนึ่งการดำเนินการต่อการเชื่อมต่อ โดยเฉพาะอย่างยิ่ง EF อนุญาตให้ดำเนินการเพียงครั้งเดียวต่อ DbContext; สิ่งนี้เป็นจริงไม่ว่าจะเป็นการดำเนินการแบบซิงโครนัสหรือแบบอะซิงโครนัส
นอกจากนี้โปรดระลึกถึงความสามารถในการปรับขนาดของแบ็กเอนด์ของคุณอีกครั้ง หากคุณกดปุ่ม SQL Server เพียงครั้งเดียวและ IIS ของคุณสามารถรักษา SQLServer ได้อย่างเต็มประสิทธิภาพแล้วการเพิ่มหรือเพิ่มแรงกดดันให้กับ SQLServer จะไม่ช่วยคุณเลย