ConfigureAwait (false) เกี่ยวข้องใน ASP.NET Core หรือไม่


108

ฉันพบปัญหา ( https://github.com/HTBox/allReady/issues/1313 ) ที่ GitHub ซึ่งพวกเขาคุยกันเกี่ยวกับการConfigureAwait(false)เอาโค้ดออกโดยอ้างว่าในASP.NET Core

การโทรไปConfigureAwait(false)ซ้ำซ้อนและไม่ทำอะไรเลย

สิ่งที่ดีที่สุดที่ฉันสามารถหาได้ที่นี่คือ "บันทึกด้านข้าง" ในคำตอบ (จาก Stephen Cleary, https://stackoverflow.com/a/40220190/2805831 ) บอกว่า

ASP.NET Core ไม่มี "บริบท" อีกต่อไป

ดังนั้นจึงConfigureAwait(false)ไม่จำเป็นจริงๆในASP.NET Core (แม้ว่าจะใช้. Net Framework แบบเต็ม)? มันมีประสิทธิภาพที่แท้จริงในบางกรณีหรือไม่หรือความแตกต่างในผลลัพธ์ / ความหมาย?

แก้ไข:ในแง่มุมนี้จะแตกต่างกันหรือไม่ถ้าฉันโฮสต์เป็นแอปพลิเคชันคอนโซลหรือใน IIS


2
ขึ้นอยู่กับตำแหน่งที่คุณวางแผนจะใช้ หากคุณต้องการใช้โดยตรงในแอปพลิเคชัน ASP.NET Core ของคุณคุณก็ไม่จำเป็นต้องเรียกมัน (คุณไม่จำเป็นต้องเรียกมันใน ASP.NET ดั้งเดิมหรือ iirc) แต่ถ้าคุณเขียนไลบรารีคุณควรใช้เสมอConfigureAwait(false)เนื่องจากแอปพลิเคชั่นต่างๆสามารถใช้งาน ไลบรารีได้ (ASP.NET Core, WPF, UWP, Console เป็นต้น)
Tseng

1
ASP.NET Core ทำงานเป็นแอปพลิเคชันคอนโซลตามค่าเริ่มต้นและแอปพลิเคชันคอนโซล AFAIK ไม่มี SynchronizationContext ดังนั้นใช่สิ่งนี้ฟังดูสมเหตุสมผลสำหรับแอปพลิเคชัน ASP.NET Core เริ่มต้นแม้จะมี Framework แบบเต็มก็ตาม
Joe White

@JoeWhite ตกลงแก้ไขคำถาม จะแตกต่างกันไหมถ้าแอพ ASP.NET Core ของฉันอยู่ใน IIS
Pedro Lorentz

3
แอป ASP.NET Core ที่ทำงานใน IIS ยังคงทำงานเป็นแอปพลิเคชันคอนโซลข้อแตกต่างเพียงอย่างเดียวคือ IIS เริ่มต้นและปิดอินสแตนซ์ของแอปของคุณ (เช่นเดียวกับที่มีการจัดการอินสแตนซ์ของกระบวนการผู้ปฏิบัติงาน ASP.NET ใน ASP.NET แบบคลาสสิก) มันจะไม่เปลี่ยนพฤติกรรมที่เกี่ยวข้องกับเธรดใด ๆ ในแอป ASP.NET ของคุณ (เหตุผลเดียวที่ฉันระบุ "โดยค่าเริ่มต้น" คือคุณสามารถโฮสต์ ASP.NET Core ภายในแอป GUI ได้เช่นกันและในกรณีนี้คุณจะต้องคิดถึงบริบทการซิงโครไนซ์)
Joe White

หมายเหตุ: ConfigureAwait(false)ในขณะที่เกี่ยวข้องใน ASP.NET คลาสสิกโดยหมายความว่าไม่มีความจำเป็น มันเป็นการแลกเปลี่ยน: มันช่วยลดการหยุดชะงักของการซิงค์เกิน async (ซึ่งเป็นข้อบกพร่องในการออกแบบอยู่ดี - ไม่มีอยู่จริงเว้นแต่จะมีคนทำอะไรโง่ ๆ ) และบางครั้งก็มีการเพิ่มประสิทธิภาพ ~ ไมโครวินาทีโดยไม่โหลดบริบทใหม่ ในราคาที่ไม่สามารถขึ้นอยู่กับบริบทและมีConfigureAwaitทั้งหมดผ่านโค้ดของคุณ stackoverflow.com/questions/28221508/…
Dax Fohl

คำตอบ:


115

ConfigureAwaitมีผลเฉพาะกับโค้ดที่ทำงานในบริบทSynchronizationContextที่ ASP.NET Core ไม่มี (ASP.NET "Legacy")

รหัสวัตถุประสงค์ทั่วไปยังควรใช้เนื่องจากอาจทำงานด้วยไฟล์SynchronizationContext.

ASP.NET Core SynchronizationContext


19
เพียงต้องการชี้แจงเล็กน้อย ASP.NET ในสภาพแวดล้อมที่ไม่ใช่คอร์จะมีบริบทการซิงค์ แต่แกน ASP.NET ไม่มี
Scott Chamberlain

@ มอร์กาโดจริงหรือไม่แม้ว่าแอปจะโฮสต์ใน IIS ก็ตาม
Pedro Lorentz

8
แอป ASP.NET Core ไม่ได้โฮสต์ใน IIS IIS ทำหน้าที่เป็น reverse proxy
Paulo Morgado

2
ฉันได้อัปเดตคำตอบด้วยโพสต์ล่าสุดจาก Stephen Cleary แต่ใช่ ASP.NET Core คือ ASP.NET Core
Paulo Morgado

14
@NamNgo. ชื่นชมนี่เป็นโพสต์เก่าในตอนนี้ แต่ Stephen Cleary ชี้แจงเรื่องนี้ในคำถามหนึ่งในโพสต์ที่ Paulo เชื่อมโยงไว้ "เป็นเฟรมเวิร์ก (ASP.NET Core ซึ่งตรงข้ามกับ ASP.NET Classic) ที่กำหนด SynchronizationContext ไม่ใช่รันไทม์ (.NET Core เมื่อเทียบกับ. NET 4.6.2)"
Gavin Sutherland

14

อะไรประมาณนี้

ในขณะนี้ (ก.พ. 2563) นักพัฒนาใน MS Blog แนะนำให้ใช้ ConfigureAwait (false) เพื่อปรับปรุงประสิทธิภาพหลีกเลี่ยงการหยุดชะงัก https://devblogs.microsoft.com/dotnet/configureawait-faq/

ฉันเคยได้ยินว่า ConfigureAwait (false) ไม่จำเป็นใน. NET Core อีกต่อไป จริงหรือ? เท็จ จำเป็นเมื่อรันบน. NET Core ด้วยเหตุผลเดียวกันกับที่จำเป็นเมื่อรันบน. NET Framework ไม่มีอะไรเปลี่ยนแปลงในเรื่องนั้น


หากรหัสผู้ใช้บางส่วน (หรือรหัสไลบรารีอื่น ๆ ที่แอปของคุณใช้) ตั้งค่าบริบทที่กำหนดเองและเรียกใช้รหัสของคุณหรือเรียกใช้รหัสของคุณในงานที่กำหนดเวลาให้กับ TaskScheduler ที่กำหนดเองแม้แต่ใน ASP.NET Core การรอคอยของคุณอาจเห็นสิ่งที่ไม่ใช่ บริบทเริ่มต้นหรือตัวกำหนดตารางเวลาที่จะทำให้คุณต้องการใช้ ConfigureAwait (false) แน่นอนในสถานการณ์เช่นนี้หากคุณหลีกเลี่ยงการบล็อกแบบซิงโครนัส (ซึ่งคุณควรหลีกเลี่ยงการทำในเว็บแอปโดยไม่คำนึงถึง) และหากคุณไม่คำนึงถึงค่าใช้จ่ายด้านประสิทธิภาพเพียงเล็กน้อยในเหตุการณ์ที่ จำกัด เช่นนี้คุณอาจหลีกเลี่ยงได้โดยไม่ต้องใช้ ConfigureAwait (เท็จ) .
Alisson

3
ตามนั้นฉันว่าสำหรับกรณีส่วนใหญ่มันไม่จำเป็น เว้นแต่คุณจะใช้บริบทการซิงโครไนซ์ที่กำหนดเองหรือใช้ไลบรารีที่ทำเช่นนั้น
Alisson
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.