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
สรุป
สรุป: 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- Task/ValueTask และเครื่องจักรสถานะ async (แนวคิด)
- ข้อควรระวังของ async: sync-over-async และเดดล็อก
- ConfigureAwait และการไหลของข้อยกเว้น