คำตอบของ SLaks and Killercam นั้นดี ฉันคิดว่าฉันจะเพิ่มบริบทอีกเล็กน้อย
คำถามแรกของคุณเป็นหลักเกี่ยวกับวิธีการที่สามารถทำเครื่องหมายasyncได้
วิธีที่ทำเครื่องหมายว่าasyncสามารถส่งคืนvoidได้TaskหรือTask<T>. อะไรคือความแตกต่างระหว่างพวกเขา?
คุณTask<T>สามารถรอเมธอด async ที่ส่งคืนได้และเมื่องานเสร็จสมบูรณ์จะได้รับ T
คุณTaskสามารถรอเมธอด async ที่ส่งคืนได้และเมื่องานเสร็จสมบูรณ์ความต่อเนื่องของงานจะถูกกำหนดให้รัน
voidวิธี async กลับไม่สามารถรอคอย; มันเป็นวิธี "จุดไฟและลืม" มันทำงานแบบอะซิงโครนัสและคุณไม่มีทางบอกได้เมื่อเสร็จสิ้น นี่มันแปลกกว่านิดหน่อย ตามที่ SLaks กล่าวโดยปกติคุณจะทำได้ก็ต่อเมื่อสร้างตัวจัดการเหตุการณ์แบบอะซิงโครนัส เหตุการณ์เริ่มขึ้นตัวจัดการดำเนินการ; จะไม่มีใคร "รอ" งานที่ตัวจัดการเหตุการณ์ส่งคืนเพราะตัวจัดการเหตุการณ์ไม่ส่งคืนงานและแม้ว่าจะทำเช่นนั้นรหัสใดจะใช้งานสำหรับบางสิ่ง โดยทั่วไปจะไม่ใช่รหัสผู้ใช้ที่โอนการควบคุมไปยังตัวจัดการในตอนแรก
คำถามที่สองของคุณในความคิดเห็นเกี่ยวกับสิ่งที่สามารถแก้ไขได้await:
มีวิธีการใดบ้างที่สามารถแก้ไขได้await? วิธีการคืนค่าโมฆะสามารถแก้ไขได้awaitหรือไม่?
ไม่ได้ไม่สามารถรอวิธีการคืนค่าเป็นโมฆะได้ คอมไพลเลอร์แปลawait M()เป็น call to M().GetAwaiter()ซึ่งGetAwaiterอาจเป็นวิธีการอินสแตนซ์หรือวิธีการขยาย มูลค่าที่รอคอยจะต้องเป็นมูลค่าที่คุณรอได้ เห็นได้ชัดว่าวิธีการคืนค่าเป็นโมฆะไม่ก่อให้เกิดมูลค่าที่คุณจะได้รับ
Task- วิธีการคืนค่าสามารถสร้างมูลค่าที่รอคอยได้ เราคาดหวังว่าบุคคลที่สามจะต้องการสร้างการนำTaskอ็อบเจ็กต์ที่มีลักษณะเหมือนของตนเองไปใช้งานและคุณจะสามารถรอได้ แต่คุณจะไม่ได้รับอนุญาตที่จะประกาศasyncวิธีการที่ผลตอบแทนอะไร แต่void, หรือTaskTask<T>
(อัปเดต: ประโยคสุดท้ายของฉันอาจมีการปลอมแปลงโดย C # เวอร์ชันอนาคตมีข้อเสนอให้อนุญาตประเภทการส่งคืนอื่นที่ไม่ใช่ประเภทงานสำหรับวิธีการ async)
(อัปเดต: คุณลักษณะที่กล่าวถึงข้างต้นทำให้อยู่ใน C # 7)