การแปลงโดยปริยายเกิดขึ้นระหว่าง 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
คีย์เวิร์ด