首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

.NET 並行程式設計系列(四):Task 睡眠/等待的三種方式與優劣比較

     編輯:關於.NET

讓 Task 暫停執行指定時間有三種方式,各有適用場景與副作用。

方式一:CancellationToken.WaitHandle.WaitOne(推薦)

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 表示時間到
  • Task 從排程器釋放,不佔用執行緒資源

方式二:Thread.Sleep(傳統)

Thread.Sleep(10000); // 睡 10 秒
token.ThrowIfCancellationRequested(); // 喚醒後檢查

缺點:

  • 阻塞執行緒,Cancel() 無法立即生效,必須等睡眠結束才檢查
  • 長時間睡眠嚴重降低回應性

方式三:Thread.SpinWait(自旋等待)

Thread.SpinWait(10000); // CPU 時間片輪轉 10000 次

特點:

  • 執行緒不釋出排程器,持續佔用 CPU
  • 等待時間取決於 CPU 速度,不可精確控制
  • 常用於極短暫等待(如自旋鎖),避免執行緒切換開銷

比較總結

方式可被取消喚醒佔用 CPU精確時間控制適用場景
WaitHandle.WaitOne✓否(釋出執行緒)佳一般等待、可取消操作
Thread.Sleep✗(延遲生效)否佳不需即時取消的簡單延遲
Thread.SpinWait✗是(100%)差極短暫同步、自旋鎖實作
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved