คำตอบของ 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
, หรือTask
Task<T>
(อัปเดต: ประโยคสุดท้ายของฉันอาจมีการปลอมแปลงโดย C # เวอร์ชันอนาคตมีข้อเสนอให้อนุญาตประเภทการส่งคืนอื่นที่ไม่ใช่ประเภทงานสำหรับวิธีการ async)
(อัปเดต: คุณลักษณะที่กล่าวถึงข้างต้นทำให้อยู่ใน C # 7)