From: 011netservice@gmail.com Date: 2025-06-21 Subject: SemaphoreSlim https://svc.011.idv.tw/CodeHelper/cs/KeyWord/SemaphoreSlim.txt 歡迎來信交流, 訂購軟體需求. SemaphoreSlim 的使用說明 若只需要簡單的同步保護(不需要 await),可以用 lock. 但若要在 async 方法中保護資源,就要用 SemaphoreSlim。 SemaphoreSlim` 是 .NET 中用來控制對資源的並行存取的輕量級同步原件,特別適合在 非同步程式碼中使用。 它的主要用途是限制同時存取某個資源的執行緒或任務數量。 基本概念 - SemaphoreSlim 可設定「同時允許幾個執行緒進入」的數量。 - 支援 Wait()(同步)和 WaitAsync()(非同步)方法。 - 常用於保護非同步區塊,避免 race condition 或資源競爭。 使用情境 使用 SemaphoreSlim(1, 1)可模擬 lock, 的效果, 但多支援 await: private readonly SemaphoreSlim _semaphore = new(1, 1); 表示: - 最多只有 1 個任務 可以同時進入受保護區塊。 - 其他任務會等待直到前一個釋放。 使用範例 非同步寫入保護版本: await _semaphore.WaitAsync(); // 等待進入 try { await _writer.WriteLineAsync(message); } finally { _semaphore.Release(); // 釋放 } 同步版本: _semaphore.Wait(); // 同步等待 try { _writer.WriteLine(message); } finally { _semaphore.Release(); } 注意事項 - 不要忘記 Release(), 否則其他任務會永遠卡住。 - SemaphoreSlim可重複使用,但在 Dispose() 或 DisposeAsync()中要記得釋放。 - 若只需要簡單的同步保護(不需要 await),可以用 lock. 但若要在 async 方法中保護資源,就要用 SemaphoreSlim。