ฉันคิดว่าความจริงคลุมเครือแม้จากเอกสารของ Microsoft:
ใน Visual Studio 2012 และ. NET Framework 4.5 วิธีการใด ๆ ที่ประกอบด้วยasync
คีย์เวิร์ด ( Async
ใน Visual Basic) ถือเป็นวิธีการแบบอะซิงโครนัสและคอมไพเลอร์ C # และ Visual Basic จะทำการแปลงที่จำเป็นเพื่อใช้วิธีการแบบอะซิงโครนัสโดยใช้ TAP วิธีการอะซิงโครนัสควรส่งคืนวัตถุTask
หรือTask<TResult>
วัตถุ
http://msdn.microsoft.com/en-us/library/hh873177(v=vs.110).aspx
ไม่ถูกต้องอยู่แล้ว วิธีการใด ๆ ที่มีasync
เป็นแบบอะซิงโครนัสจากนั้นจึงบอกว่าควรส่งคืน a Task
หรือTask<T>
- ซึ่งไม่ถูกต้องสำหรับวิธีการที่ด้านบนของ call stack, Button_Click เป็นต้นหรือasync void
.
แน่นอนคุณต้องพิจารณาว่าอะไรคือจุดสำคัญของการประชุมใหญ่?
คุณสามารถพูดได้ว่าหลักการAsync
ต่อท้ายคือการสื่อสารกับผู้ใช้ API ว่าวิธีนี้รออยู่ สำหรับวิธีการที่จะ awaitable ก็ต้องกลับTask
สำหรับเป็นโมฆะหรือTask<T>
หาวิธีการที่คุ้มค่ากลับมาซึ่งหมายความว่าเพียงหลังสามารถ suffixed Async
กับ
หรือคุณอาจพูดได้ว่าหลักการAsync
ต่อท้ายคือการสื่อสารว่าเมธอดสามารถคืนค่าได้ทันทีโดยปล่อยเธรดปัจจุบันเพื่อทำงานอื่นและอาจทำให้เกิดการแข่งขัน
คำพูดของ Microsoft doc นี้กล่าวว่า:
ตามแบบแผนคุณต้องต่อท้าย "Async" ต่อท้ายชื่อของวิธีการที่มีตัวปรับเปลี่ยน Async หรือ async
http://msdn.microsoft.com/en-us/library/hh191443.aspx#BKMK_NamingConvention
ซึ่งไม่ได้พูดถึงว่าวิธีการแบบอะซิงโครนัสของคุณกลับมานั้นTask
ต้องการAsync
คำต่อท้ายซึ่งฉันคิดว่าเราทุกคนเห็นด้วย
ดังนั้นคำตอบสำหรับคำถามนี้อาจเป็นได้ทั้งสองอย่าง ในทั้งสองกรณีที่คุณจำเป็นต้องผนวกAsync
กับวิธีการที่มีasync
คำหลักและผลตอบแทนที่หรือTask
Task<T>
ฉันจะขอให้ Stephen Toub ชี้แจงสถานการณ์
อัปเดต
ดังนั้นฉันจึงทำ และนี่คือสิ่งที่คนดีของเราเขียน:
หากเมธอดสาธารณะคือการส่งคืนงานและเป็นแบบอะซิงโครนัส (ตรงข้ามกับวิธีการที่ทราบว่าจะดำเนินการพร้อมกันเพื่อให้เสร็จสมบูรณ์เสมอ แต่ยังคงส่งคืนงานด้วยเหตุผลบางประการ) ก็ควรมีคำต่อท้าย“ Async” นั่นคือแนวทาง เป้าหมายหลักในการตั้งชื่อนี้คือการทำให้ผู้บริโภคเห็นได้ชัดถึงฟังก์ชันการทำงานที่ว่าวิธีการที่เรียกใช้อาจจะไม่ทำงานทั้งหมดพร้อมกัน แน่นอนว่ายังช่วยในกรณีที่มีการเปิดเผยฟังก์ชันการทำงานด้วยวิธีการซิงโครนัสและอะซิงโครนัสเช่นนั้นคุณต้องมีความแตกต่างของชื่อเพื่อแยกความแตกต่าง วิธีการบรรลุการใช้งานแบบอะซิงโครนัสนั้นไม่มีความสำคัญต่อการตั้งชื่อ: ไม่ว่าจะใช้ async / await เพื่อรวบรวมความช่วยเหลือของคอมไพเลอร์หรือว่าประเภทและวิธีการจาก System.Threading งานถูกใช้โดยตรง (e. ก. TaskCompletionSource) ไม่สำคัญนักเนื่องจากจะไม่ส่งผลกระทบต่อลายเซ็นของวิธีการเท่าที่ผู้บริโภคใช้วิธีนี้เกี่ยวข้อง
แน่นอนว่ามีข้อยกเว้นเสมอสำหรับแนวทางปฏิบัติ สิ่งที่น่าสังเกตมากที่สุดในกรณีของการตั้งชื่อคือกรณีที่ raison d'etre ทั้งประเภทให้ฟังก์ชันการทำงานที่เน้น async ซึ่งในกรณีนี้การมี Async ในทุกวิธีจะเป็นการใช้งานมากเกินไปเช่นวิธีการใน Task ที่สร้าง Tasks อื่น ๆ .
สำหรับวิธีการแบบอะซิงโครนัสที่คืนค่าเป็นโมฆะไม่พึงปรารถนาที่จะมีวิธีการดังกล่าวในพื้นที่สาธารณะเนื่องจากผู้เรียกไม่มีวิธีที่ดีในการรู้ว่างานอะซิงโครนัสเสร็จสิ้นเมื่อใด หากคุณต้องเปิดเผยวิธีการอะซิงโครนัสที่คืนค่าเป็นโมฆะต่อสาธารณะคุณน่าจะต้องการมีชื่อที่บ่งบอกว่างานอะซิงโครนัสกำลังเริ่มต้นขึ้นและคุณสามารถใช้คำต่อท้าย“ Async” ที่นี่ได้หากเหมาะสม เมื่อพิจารณาถึงความยากของกรณีนี้ฉันขอยืนยันว่ามันเป็นการตัดสินใจแบบเคสต่อกรณี
ฉันหวังว่าจะช่วยได้สตีฟ
คำแนะนำสั้น ๆ จากประโยคเปิดของ Stephen นั้นชัดเจนเพียงพอ ไม่รวมasync void
เนื่องจากเป็นเรื่องผิดปกติที่ต้องการสร้าง API สาธารณะด้วยการออกแบบดังกล่าวเนื่องจากวิธีที่ถูกต้องในการใช้โมฆะอะซิงโครนัสคือการส่งคืนTask
อินสแตนซ์ธรรมดาและปล่อยให้คอมไพเลอร์ใช้เวทมนตร์ อย่างไรก็ตามหากคุณต้องการขอแนะนำให้public async void
ต่อท้าย Async
วิธีการด้านบนของสแต็กasync void
อื่น ๆ เช่นตัวจัดการเหตุการณ์มักจะไม่เป็นสาธารณะและไม่สำคัญ / มีคุณสมบัติ
สำหรับผมมันบอกว่าถ้าฉันพบตัวเองสงสัยเกี่ยวกับ suffixing Async
บนasync void
ผมอาจจะเปิดเป็นเพื่อให้สายที่สามารถรอมันแล้วผนวกasync Task
Async