A semaphore limits how many callers can enter a protected region at once. Unlike a lock, which normally allows one owner, a semaphore can allow N concurrent operations. `SemaphoreSlim` is useful for in-process asynchronous throttling—for example, limiting calls to a downstream API or the number of files processed at once. ```csharp private readonly SemaphoreSlim gate = new(initialCount: 4); public async Task<string> FetchAsync(string path, CancellationToken ct) { await gate.WaitAsync(ct); try { return await http.GetStringAsync(path, ct); } finally { gate.Release(); } } ``` Always release in `finally`. This limits concurrency but does not make shared mutable state safe by itself. It also protects only one process; multiple application instances need a downstream-enforced limit, distributed coordination, or queue. Avoid creating a new semaphore per call because that provides no shared limit. For large producer/consumer flows, a bounded `Channel<T>` often expresses backpressure more clearly.
Pooja Parmar · · 0 likes