การแปลงโดยปริยายเกิดขึ้นระหว่าง Task <> และ int หรือไม่
Nope นี่เป็นเพียงส่วนหนึ่งของวิธีการasync/ awaitทำงาน
วิธีการใด ๆ ที่ประกาศว่าasyncต้องมีผลตอบแทนประเภท:
void (หลีกเลี่ยงถ้าเป็นไปได้)
Task (ไม่มีผลลัพธ์นอกเหนือจากการแจ้งความสำเร็จ / ล้มเหลว)
Task<T>(สำหรับผลลัพธ์เชิงตรรกะของประเภทTในลักษณะไม่ซิงค์)
คอมไพเลอร์ทำการห่อที่เหมาะสมทั้งหมด ประเด็นก็คือคุณกำลังส่งคืนแบบอะซิงโครนัสurlContents.Length - คุณไม่สามารถทำให้เมธอดกลับมาintได้เนื่องจากเมธอดจริงจะส่งคืนเมื่อมันไปถึงawaitนิพจน์แรกที่ยังไม่เสร็จ ดังนั้นแทนที่จะส่งกลับTask<int>ซึ่งจะเสร็จสมบูรณ์เมื่อวิธีการ async เสร็จสิ้น
โปรดทราบว่าawaitสิ่งที่ตรงกันข้าม - มันคลาย a Task<T>เป็นTค่าซึ่งเป็นวิธีการทำงานของบรรทัดนี้:
string urlContents = await getStringTask;
... แต่แน่นอนว่ามันจะแกะมันออกมาแบบอะซิงโครนัสในขณะที่การใช้งานResultจะบล็อกจนกว่างานจะเสร็จสิ้น ( awaitสามารถแกะประเภทอื่น ๆ ที่ใช้รูปแบบที่รอคอยได้ แต่Task<T>เป็นรูปแบบที่คุณน่าจะใช้บ่อยที่สุด)
การห่อ / แกะแบบคู่นี้เป็นสิ่งที่ช่วยให้ async สามารถประกอบได้ ตัวอย่างเช่นฉันสามารถเขียนวิธี async อื่นที่เรียกคุณและเพิ่มผลลัพธ์เป็นสองเท่า:
public async Task<int> AccessTheWebAndDoubleAsync()
{
var task = AccessTheWebAsync();
int result = await task;
return result * 2;
}
(หรือreturn await AccessTheWebAsync() * 2;แน่นอน)
asyncคีย์เวิร์ด