0Pricing
C# Academy · บทเรียน

ข้อควรระวังของ 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

ตรวจสอบอย่างรวดเร็ว: เหตุใดการเรียกใช้ .Result บน Task แบบ async จึงเป็นอันตรายในบริบท UI หรือ ASP.NET

สรุป

สรุป: การบล็อก 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. Task/ValueTask และเครื่องจักรสถานะ async (แนวคิด)
  2. ข้อควรระวังของ async: sync-over-async และเดดล็อก
  3. ConfigureAwait และการไหลของข้อยกเว้น
← กลับไปที่ C# Academy