ข้อควรระวังของ async: sync-over-async และเดดล็อก
ระบุข้อควรระวังของ async เช่น sync-over-async และเดดล็อก เรียนรู้ว่าเหตุใดการเรียกแบบบล็อกจึงทำให้แอปหยุดค้าง และหลีกเลี่ยงกับดักที่พบบ่อยได้อย่างไร
ข้อควรระวังของ async: sync-over-async และเดดล็อก เป็นบทเรียน C# Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 3 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C# Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C# Academy มีบทเรียนทั้งหมด 3 บทเรียน
ภาพรวมข้อควรระวัง
ข้อควรระวัง: การทำงานแบบอะซิงโครนัสช่วยให้เขียนโค้ดได้ง่ายขึ้น แต่การผสมการทำงานแบบปกติกับแบบอะซิงโครนัสอาจทำให้แอปค้างหรือเกิดภาวะติดตาย
การบังคับงานอะซิงโครนัสให้ทำงานแบบหยุดรอ
การเรียกใช้ .Result บน Task จะบล็อกเธรด ในแอปคอนโซลอาจทำงานได้ แต่ในบริบท UI/ASP.NET มีความเสี่ยงที่จะเกิดภาวะติดตาย
using System;
using System.Threading.Tasks;
public class Program
{
static async Task<string> SayHelloAsync()
{
await Task.Delay(200); // simulate async delay
return "Hello";
}
public static void Main(string[] args)
{
// BAD: calling .Result blocks the thread
string msg = SayHelloAsync().Result;
Console.WriteLine(msg);
}
}
การทำงานจนเสร็จอย่างปลอดภัย
ในตัวอย่างแอปคอนโซล คุณสามารถบล็อกได้อย่างระมัดระวัง แต่ในแอปจริงควรใช้ async ตลอดสายการเรียก: กำหนดเมธอดเป็น async และใช้ await แทน .Result
using System;
using System.Threading.Tasks;
public class Program
{
static async Task<string> SayHelloAsync()
{
await Task.Delay(200);
return "Hello async";
}
public static void Main(string[] args)
{
// In C# 6, Main is sync; avoid blocking in real apps
string msg = SayHelloAsync().GetAwaiter().GetResult(); // safer than .Result
Console.WriteLine(msg);
}
}
กลไกภาวะติดตาย
ลำดับที่นำไปสู่ภาวะติดตาย:
- เธรดหยุดรอที่ Task.Result
- งานต่อเนื่องต้องใช้เธรดเดียวกันนั้น
- งานต่อเนื่องจึงไม่เคยทำงาน
- ผลลัพธ์ไม่มาถึง — เกิดภาวะติดตาย
ปัญหาของ Wait()
.Wait() เป็นการเรียกแบบบล็อกอีกแบบหนึ่ง ซึ่งอาจทำให้เกิดปัญหาเดียวกับ .Result
using System;
using System.Threading.Tasks;
public class Program
{
static async Task<string> WorkAsync()
{
await Task.Delay(100);
return "done";
}
public static void Main(string[] args)
{
// BAD: Wait() can also deadlock in UI/ASP.NET
WorkAsync().Wait();
Console.WriteLine("Completed");
}
}
แนวทางปฏิบัติที่ดี
แนวทาง:
- หลีกเลี่ยงการผสมการทำงานแบบปกติกับแบบ async
- ใช้ async/await ตลอดลำดับการเรียกทั้งหมด
- หยุดรอเฉพาะในแอปคอนโซลที่ใช้สาธิตเท่านั้น
- ในแอป UI หรือเว็บ อย่าเรียกใช้ .Result หรือ .Wait() เด็ดขาด
ความเสี่ยงเดดล็อกจาก Result
สรุป
สรุป: การบล็อก Task แบบ async ด้วย .Result หรือ .Wait() อาจทำให้เกิดภาวะติดตาย ควรใช้ async/await ตลอดสายการเรียก
คำถามที่พบบ่อย
บทเรียน “ข้อควรระวังของ async: sync-over-async และเดดล็อก” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ข้อควรระวังของ async: sync-over-async และเดดล็อก” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C# Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C# Academy มีบทเรียนทั้งหมด 3 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “ข้อควรระวังของ async: sync-over-async และเดดล็อก”
ระบุข้อควรระวังของ async เช่น sync-over-async และเดดล็อก เรียนรู้ว่าเหตุใดการเรียกแบบบล็อกจึงทำให้แอปหยุดค้าง และหลีกเลี่ยงกับดักที่พบบ่อยได้อย่างไร คุณปฏิบัติ C# Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C# Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน C# Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 3 บทเรียน
บทเรียน “ข้อควรระวังของ async: sync-over-async และเดดล็อก” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน C# Academy นี้ได้ไหม
ได้ บทเรียน C# Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- Task/ValueTask และเครื่องจักรสถานะ async (แนวคิด)
- ข้อควรระวังของ async: sync-over-async และเดดล็อก
- ConfigureAwait และการไหลของข้อยกเว้น