// 現在有10個人要過橋 // 但是一座橋上只能承受5個人,再多橋就會塌 public static void SemaphoreTest() { var semaphore = new SemaphoreSlim(5); for (int i = 1; i <= 10; i++) { Thread.Sleep(100); // 排隊上橋 var index = i; // 定義index 避免出現閉包的問題 Task.Run(() => { semaphore.Wait(); try { Console.WriteLine($"第{index}個人正在過橋。"); Thread.Sleep(5000); // 模擬過橋需要花費的時間 } finally { Console.WriteLine($"第{index}個人已經過橋。"); semaphore.Release(); } }); } }
運行SemaphoreTest方法,得到如下的輸出。
如代碼中的注釋,可以知道SemaphoreSlim類的作用就是控制訪問某資源的線程數量。
代碼示例中的資源就是橋,線程就是過橋的人。10個人要過橋,代表10個進程要訪問資源。但是橋是有承受限制的,所以要控制過橋上人的數量,就必須有人要等待。
通過代碼結合輸出信息就能理解SemaphoreSlim的作用了。