Проверяет знание примитивов синхронизации в .NET.
Semaphore — это обёртка над Win32 Semaphore, работает в межпроцессном и многопоточном окружении, его ожидание через WaitOne() занимает kernel transition. SemaphoreSlim — более лёгкий примитив для одного процесса, использует быстрый асинхронный механизм ожидания (без context switch) и поддерживает WaitAsync для async/await. SemaphoreSlim рекомендуют для синхронизации в управляемых приложениях.
Semaphore:
new Semaphore(initialCount, maxCount, name) — может работать между процессами.
Блокирует через kernel, дорогой.
SemaphoreSlim:
new SemaphoreSlim(initialCount, maxCount) — только в одном процессе.
Использует spin-wait + kernel fallback, поддерживает WaitAsync.
Использование:
await semaphoreSlim.WaitAsync();
try { /* ... */ }
finally { semaphoreSlim.Release(); }Вывод:
Для асинхронного кода и внутри процесса — SemaphoreSlim.
Для межпроцессного синхрона — Semaphore.