讓 Task 暫停執行指定時間有三種方式,各有適用場景與副作用。
var tokenSource = new CancellationTokenSource();
var token = tokenSource.Token;
var task = new Task(() => {
for (int i = 0; i < int.MaxValue; i++) {
bool cancelled = token.WaitHandle.WaitOne(10000); // 睡 10 秒
Console.WriteLine($"Iteration {i}, Cancelled: {cancelled}");
if (cancelled) throw new OperationCanceledException(token);
}
}, token);
task.Start();
// 主執行緒按 Enter 取消
Console.ReadLine();
tokenSource.Cancel();
特點:
CancellationToken,Cancel() 立即喚醒WaitOne 回傳 true 表示被取消喚醒,false 表示時間到Thread.Sleep(10000); // 睡 10 秒
token.ThrowIfCancellationRequested(); // 喚醒後檢查
缺點:
Cancel() 無法立即生效,必須等睡眠結束才檢查Thread.SpinWait(10000); // CPU 時間片輪轉 10000 次
特點:
| 方式 | 可被取消喚醒 | 佔用 CPU | 精確時間控制 | 適用場景 |
|---|---|---|---|---|
| WaitHandle.WaitOne | ✓ | 否(釋出執行緒) | 佳 | 一般等待、可取消操作 |
| Thread.Sleep | ✗(延遲生效) | 否 | 佳 | 不需即時取消的簡單延遲 |
| Thread.SpinWait | ✗ | 是(100%) | 差 | 極短暫同步、自旋鎖實作 |