ในบทความที่แล้ว เราจะแนะนำกระบวนการอะซิงโครนัสโดยเล่าเรื่องการทำอาหารเช้า ในบทความนี้ ฉันจะใช้งานโดยใช้ C# นอกจากนี้ เราจะเจาะลึกว่าไวยากรณ์ async/await ทำงานอย่างไรใน C#

ก่อนที่จะอ่านบทความนี้ โปรดตรวจสอบให้แน่ใจว่าคุณได้อ่านบทความก่อนหน้าของฉันเสร็จแล้ว



ตัวอย่างรหัสการทำอาหารเช้า

ด้านล่างนี้เป็นกระบวนการทำอาหารเช้าแบบซิงโครนัส…

เป็นเรื่องง่ายที่จะได้รับผลลัพธ์ภายใน 8 นาที

มาทำเวอร์ชันอะซิงโครนัสกันดีกว่า

อย่างที่คุณเห็น เราใช้เวลาเพียง 5 นาทีในการรับประทานอาหารเช้าให้เสร็จ อย่างไรก็ตาม โปรดตรวจดูอย่างใกล้ชิดเพื่อดูว่างานจะเริ่มต้นและสิ้นสุดเมื่อใด

คำอธิบายรหัส

อย่างที่คุณเห็น มี "การรอคอย" มากมายในโค้ดอะซิงโครนัสของเรา เราจะตีความมันด้วยวิธีง่ายๆ ได้อย่างไร?

จากประสบการณ์ของผม การรอคอยมีความหมายสองประการสำหรับฉันเมื่ออ่านโค้ด...

ประการแรก เมื่อโปรแกรมของคุณต้องการงานที่เชื่อมโยงกับ I/O เช่น การเรียก API หรือการดาวน์โหลดไฟล์ ในกรณีนี้ “รอ” หมายความว่าจะไม่บล็อกเธรดและรอผลลัพธ์ แต่จะกระโดดกลับไปดูว่ามีงานอื่นให้ทำแทนหรือไม่

ประการที่สอง “รอ” ยังหมายถึงฟังก์ชันรับประกันว่าจะส่งคืนผลลัพธ์ให้คุณหรือทำงานให้เสร็จก่อนที่เราจะรันโค้ดด้านล่างเพื่อรอไวยากรณ์ต่อไป

และไม่ต้องกังวลกับ "async" มันเป็นเพียงเครื่องหมายเพื่อบอกคอมไพลเลอร์ว่าเรามีไวยากรณ์ await ภายในฟังก์ชันของเรา และประเภทที่ส่งคืนจะเป็น Task

แล้วเราจะอ่านโค้ดอะซิงโครนัสด้วยการเลื่อนนิ้วของคุณได้อย่างไร?

ในตอนแรก เพียงเลื่อนนิ้วของคุณใน Main() จากบนลงล่างจนกระทั่งถึง makeCoffeeTask = MakeCoffeeAsync() เลื่อนนิ้วของคุณไปที่ด้านบนของฟังก์ชัน MakeCoffeeAsync และเริ่มเลื่อนลงจนกระทั่งถึง "รอ" จากประสบการณ์ครั้งแรกของฉัน เราจะกระโดดกลับไปดูงานอื่น ดังนั้นเราจะดำเนินการfryEgg() และfryBacon() ฟังก์ชันทั้งสองนี้ไม่พร้อมกัน ดังนั้นจึงจะเก็บทรัพยากรของเราไว้จนกว่าจะเสร็จสิ้น ขยับนิ้วของเราไปที่ toastBreadTask= toastBreadAsync() ต่อไป เช่นเดียวกับงานกาแฟ เราเลื่อนนิ้วของเราไปที่ด้านบนของฟังก์ชัน toastBreadAsync() และเริ่มลงไปจนกระทั่งถึง "await" เหมือนอย่างที่ฉันบอกไปก่อนหน้านี้ เราจะกระโดดกลับไปที่ Main() เราเดินหน้าต่อไปเพื่อ "รอ makeCoffeeTask" ถ้าเราใช้ประสบการณ์ครั้งแรกคงจะแปลกใช่ไหมล่ะ? ไม่มีอะไรจะกระโดดจนกว่าเราจะได้ผลลัพธ์ของกาแฟ ควรพิจารณาสถานการณ์นี้เป็นประสบการณ์ที่สองจะดีกว่า จะรับประกันว่าจะคืนผลลัพธ์ให้คุณ แต่จะไม่บล็อกเธรดขณะรอผล คำอธิบายเดียวกันใน “await toastBreadTask” ไม่ต้องพูดอะไร คุณก็รู้อยู่แล้วว่าจะเกิดอะไรขึ้นเมื่อเราย้ายไปที่ Combine()

บทสรุป

ใน C# ฟังก์ชันอะซิงโครนัสควรทำงานเป็นงาน มันจะถูกดำเนินการในขณะที่งานถูกสร้างขึ้น โปรแกรมเมอร์จะตัดสินใจว่าเมื่อใดที่เราต้องการผลลัพธ์ของฟังก์ชันอะซิงโครนัสนั้น สิ่งที่สำคัญที่สุดคือเราต้องรู้ว่าเมื่อใดที่ฉันควรได้รับผลลัพธ์ของงานเพื่อรันโค้ดต่อไป ไม่เช่นนั้นโค้ดของคุณจะทำงานเหมือนฟังก์ชันซิงโครนัส เรียนรู้และพยายามต่อไป คุณจะคุ้นเคยกับไวยากรณ์นี้