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

Task/ValueTask และเครื่องจักรสถานะ async (แนวคิด)

ทำความเข้าใจผลลัพธ์ของ Task และแนวคิดเครื่องจักรสถานะ async เขียนเมธอด async ขนาดเล็ก ประกอบการ await และดูการใช้งาน TaskCompletionSource ด้วยตนเอง

Task/ValueTask และเครื่องจักรสถานะ async (แนวคิด) เป็นบทเรียน C# Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 3 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C# Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C# Academy มีบทเรียนทั้งหมด 3 บทเรียน

แบบจำลองทางความคิด

เป้าหมาย: สร้างความเข้าใจเชิงสัญชาตญาณเกี่ยวกับการทำงานแบบอะซิงโครนัส

  • Task แทนงานที่กำลังดำเนินอยู่และผลลัพธ์ในอนาคต
  • await จะหยุดรอแล้วกลับมาทำงานต่อภายหลัง
  • คอมไพเลอร์จะสร้างเครื่องจักรสถานะ
  • ValueTask: การปรับปรุงประสิทธิภาพรูปแบบใหม่ (กล่าวถึงแนวคิดเท่านั้นในบทนี้)

พื้นฐานเมธอดแบบ async

เมธอด async จะคืนค่า Task<T> ทันที และภายหลังจะเสร็จสมบูรณ์พร้อมค่าผลลัพธ์เมื่องานที่รออยู่เสร็จสิ้น

using System;
using System.Threading;
using System.Threading.Tasks;

public class Program
{
  // Tiny async method: returns Task<int>
  static async Task<int> GetAnswerAsync()
  {
    // Offload simple work to a thread-pool task (demo only)
    int value = await Task.Run(() =>
    {
      Thread.Sleep(200); // simulate work
      return 42;
    });
    return value; // completes Task<int>
  }

  public static void Main(string[] args)
  {
    // In C# 6, Main cannot be async; block just for demo (console apps are safe here)
    int result = GetAnswerAsync().Result;
    Console.WriteLine("Answer = " + result);
  }
}

การประกอบขั้นตอนการรอ

การใช้ await ช่วยให้เขียนขั้นตอนแบบอะซิงโครนัสที่ต่อเนื่องตามลำดับได้อย่างชัดเจนในรูปแบบจากบนลงล่าง

using System;
using System.Threading;
using System.Threading.Tasks;

public class Program
{
  static async Task<int> Step1Async()
  {
    // pretend I/O
    await Task.Delay(100);
    return 10;
  }

  static async Task<int> Step2Async(int x)
  {
    await Task.Delay(100);
    return x * 3; // simple transform
  }

  static async Task<int> PipelineAsync()
  {
    int a = await Step1Async();   // await first
    int b = await Step2Async(a);  // then await second
    return a + b;                 // total 10 + 30 = 40
  }

  public static void Main(string[] args)
  {
    int total = PipelineAsync().Result; // block in demo
    Console.WriteLine("Total = " + total);
  }
}

แนวคิดเครื่องจักรสถานะ

แนวคิด: คอมไพเลอร์จะแปลงเมธอดแบบอะซิงโครนัสให้เป็นเครื่องจักรสถานะ

  • ตัวแปรภายในจะถูกเก็บเป็นฟิลด์
  • การใช้ await แต่ละครั้งจะทำให้เกิดสถานะใหม่
  • เมื่อ Task ที่รออยู่เสร็จสมบูรณ์ งานต่อเนื่องจะทำให้เมธอดทำงานต่อ
  • ข้อยกเว้นจะถูกจับไว้และบันทึกลงใน Task

ตัวอย่าง TaskCompletionSource

TaskCompletionSource ช่วยให้สร้าง Task และส่งสัญญาณให้เสร็จสมบูรณ์ในภายหลังได้ การใช้ await รับผลลัพธ์จากมันได้เหมือนกับ Task อื่น ๆ

using System;
using System.Threading;
using System.Threading.Tasks;

public class Program
{
  // Emulate an async source that completes later
  static Task<string> MakeTaskManually()
  {
    var tcs = new TaskCompletionSource<string>();
    // Complete on a worker after a short delay
    ThreadPool.QueueUserWorkItem(_ =>
    {
      Thread.Sleep(150);
      tcs.SetResult("done");
    });
    return tcs.Task;
  }

  static async Task<string> UseAsyncSource()
  {
    string s = await MakeTaskManually(); // await a Task you created
    return s.ToUpperInvariant();
  }

  public static void Main(string[] args)
  {
    Console.WriteLine(UseAsyncSource().Result);
  }
}

แนวคิด ValueTask

ValueTask (แนวคิด): ชนิดข้อมูลผลลัพธ์แบบใหม่ที่ช่วยลดการจัดสรรหน่วยความจำสำหรับผลลัพธ์ที่มักเสร็จสิ้นทันที

  • มีประโยชน์เมื่อผลลัพธ์พร้อมใช้งานอยู่แล้วเกือบตลอดเวลา
  • มีกฎเพื่อหลีกเลี่ยงการจัดสรรหน่วยความจำเพิ่มเติม
  • ไม่มีใน C# 6 — ให้ใช้ Task ที่นี่ แนวคิดยังคงใช้ได้

เครื่องจักรสถานะแบบ async

ตรวจสอบอย่างรวดเร็ว: คอมไพเลอร์ C# สร้างอะไรให้กับเมธอดแบบ async ที่ใช้ await

สรุป

สรุป: Task ใช้จำลองงาน await จะหยุดรอแล้วทำงานต่อ และคอมไพเลอร์จะสร้างเครื่องจักรสถานะ ส่วน ValueTask เป็นแนวคิดด้านการปรับปรุงประสิทธิภาพ (ใน C# 6 ให้ใช้ Task)

คำถามที่พบบ่อย

บทเรียน “Task/ValueTask และเครื่องจักรสถานะ async (แนวคิด)” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “Task/ValueTask และเครื่องจักรสถานะ async (แนวคิด)” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C# Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C# Academy มีบทเรียนทั้งหมด 3 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “Task/ValueTask และเครื่องจักรสถานะ async (แนวคิด)”

ทำความเข้าใจผลลัพธ์ของ Task และแนวคิดเครื่องจักรสถานะ async เขียนเมธอด async ขนาดเล็ก ประกอบการ await และดูการใช้งาน TaskCompletionSource ด้วยตนเอง คุณปฏิบัติ C# Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C# Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน C# Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 3 บทเรียน

บทเรียน “Task/ValueTask และเครื่องจักรสถานะ async (แนวคิด)” ใช้เวลานานแค่ไหน

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

ฉันเขียนและรันโค้ดในบทเรียน C# Academy นี้ได้ไหม

ได้ บทเรียน C# Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

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