การหมดเวลา IProgress<T> และทรัพยากร async (การจำลอง)
ใช้การหมดเวลาด้วย CancelAfter หรือ Task.WhenAny เชื่อม IProgress เพื่ออัปเดตที่เหมาะกับ UI และใช้ try/finally จำลองการทำความสะอาดแบบ async ใน C# 6
การหมดเวลา IProgress<T> และทรัพยากร async (การจำลอง) เป็นบทเรียน C# Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 3 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C# Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C# Academy มีบทเรียนทั้งหมด 3 บทเรียน
แผนการ
เป้าหมาย:
- กำหนดเวลาหมดเวลาด้วย CancelAfter
- กำหนดเวลาหมดเวลาด้วย Task.WhenAny
- รายงานความคืบหน้าด้วย IProgress<T>
- ใช้รูปแบบการล้างทรัพยากรแบบอะซิงโครนัสใน C# 6 ด้วย try/finally
กำหนดเวลาหมดเวลาด้วย CancelAfter
ใช้ CancelAfter และส่งโทเค็นให้ API แบบอะซิงโครนัส เมื่อหมดเวลา เมธอดที่ถูกเรียกจะหยุดทำงานแบบร่วมมือกัน
using System;
using System.Threading;
using System.Threading.Tasks;
public class Program
{
static async Task<string> SlowOpAsync(CancellationToken ct)
{
// Simulate slow I/O that honors cancellation
await Task.Delay(500, ct);
return "OK";
}
public static void Main(string[] args)
{
var cts = new CancellationTokenSource();
cts.CancelAfter(150); // timeout after 150 ms
Task<string> t = SlowOpAsync(cts.Token);
try
{
string result = t.GetAwaiter().GetResult(); // demo only
Console.WriteLine(result);
}
catch (OperationCanceledException)
{
Console.WriteLine("Timed out");
}
}
}
กำหนดเวลาหมดเวลาด้วย WhenAny
Task.WhenAny แข่งขันระหว่างงานกับ Task.Delay หากการหน่วงเวลาชนะ ให้โยน TimeoutException
using System;
using System.Threading.Tasks;
public class Program
{
// Wrap any Task<T> with a timeout using WhenAny
static async Task<T> WithTimeoutAsync<T>(Task<T> work, int milliseconds)
{
Task delay = Task.Delay(milliseconds);
Task first = await Task.WhenAny(work, delay);
if (first == work) return await work; // completed in time
throw new TimeoutException("Operation timed out");
}
static async Task<int> ComputeAsync()
{
await Task.Delay(300); // pretend work
return 7;
}
public static void Main(string[] args)
{
try
{
int v = WithTimeoutAsync(ComputeAsync(), 100).GetAwaiter().GetResult();
Console.WriteLine("Value " + v);
}
catch (TimeoutException ex)
{
Console.WriteLine(ex.Message);
}
}
}
การสาธิต IProgress<T>
IProgress<T> แยกงานออกจากส่วนติดต่อผู้ใช้ ผู้ผลิตเรียก Report ส่วนผู้ใช้นำไปอัปเดตส่วนติดต่อผู้ใช้หรือเธรดอย่างปลอดภัย
using System;
using System.Threading.Tasks;
public class Program
{
static async Task DownloadAsync(IProgress<int> progress)
{
// Report 0..100 in steps; UI would receive ProgressChanged on its context
for (int p = 0; p <= 100; p += 25)
{
await Task.Delay(60);
if (progress != null) progress.Report(p);
}
}
public static void Main(string[] args)
{
Progress<int> prog = new Progress<int>(percent =>
{
Console.WriteLine("Progress: " + percent + "%");
});
DownloadAsync(prog).GetAwaiter().GetResult();
}
}
รูปแบบการล้างทรัพยากรแบบอะซิงโครนัส
C# 6 ไม่มี IAsyncDisposable ให้ใช้ try/finally และล้างทรัพยากรใน finally หลังงานที่รอเสร็จสมบูรณ์แล้ว
using System;
using System.IO;
using System.Threading.Tasks;
public class Program
{
static async Task WriteThenCloseAsync(string path)
{
// C# 6 has no IAsyncDisposable; emulate with try/finally.
FileStream fs = null;
StreamWriter sw = null;
try
{
fs = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.None);
sw = new StreamWriter(fs);
await sw.WriteAsync("hello"); // do async work
await sw.FlushAsync(); // ensure data is flushed
}
finally
{
// Dispose synchronously in finally
if (sw != null) sw.Dispose();
else if (fs != null) fs.Dispose();
}
}
public static void Main(string[] args)
{
WriteThenCloseAsync("out.txt").GetAwaiter().GetResult();
Console.WriteLine("Written");
}
}
แนวทางปฏิบัติที่ดี
เคล็ดลับ:
- เลือกใช้ CancelAfter สำหรับการกำหนดเวลาหมดเวลาของการดำเนินการแบบง่าย
- ใช้ WhenAny สำหรับกระบวนการกำหนดเวลาหมดเวลาแบบกำหนดเอง
- ทำชนิดข้อมูลความคืบหน้าให้มีขนาดเล็ก เช่น จำนวนเต็มแสดงเปอร์เซ็นต์หรือโครงสร้างข้อมูลแบบง่าย
- รอการทำงานแบบอะซิงโครนัสทั้งหมดให้เสร็จก่อนล้างทรัพยากรเสมอ โดยวางการล้างทรัพยากรไว้ใน finally
รูปแบบการกำหนดเวลาหมดเวลา
ทบทวน
ทบทวน: ใช้ CancelAfter หรือ WhenAny เพื่อกำหนดเวลาหมดเวลา รายงานความคืบหน้าผ่าน IProgress<T> และจำลองการล้างทรัพยากรแบบอะซิงโครนัสด้วย try/finally ใน C# 6
เรียนรู้ C# ด้วย AI tutor — ฟรี
เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป
- คอร์ส
- 93
- บทเรียน
- 346
คำถามที่พบบ่อย
บทเรียน “การหมดเวลา IProgress<T> และทรัพยากร async (การจำลอง)” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การหมดเวลา IProgress<T> และทรัพยากร async (การจำลอง)” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C# Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C# Academy มีบทเรียนทั้งหมด 3 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การหมดเวลา IProgress<T> และทรัพยากร async (การจำลอง)”
ใช้การหมดเวลาด้วย CancelAfter หรือ Task.WhenAny เชื่อม IProgress เพื่ออัปเดตที่เหมาะกับ UI และใช้ try/finally จำลองการทำความสะอาดแบบ async ใน C# 6 คุณปฏิบัติ C# Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C# Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน C# Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 3 บทเรียน
บทเรียน “การหมดเวลา IProgress<T> และทรัพยากร async (การจำลอง)” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน C# Academy นี้ได้ไหม
ได้ บทเรียน C# Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- รูปแบบ CancellationToken และการยกเลิกแบบร่วมมือกัน
- การหมดเวลา IProgress และทรัพยากร async (การจำลอง)
- พื้นฐานความทนทาน: การลองใหม่และการหน่วงเพิ่ม