В чем различия между SemaphoreSlim и Semaphore?

«В чем различия между SemaphoreSlim и Semaphore?» — вопрос из категории Многопоточность, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

SemaphoreSlim — это легковесная, управляемая (user-mode) реализация семафора для синхронизации в пределах одного процесса. Semaphore — это обёртка над объектом ядра ОС, которая поддерживает межпроцессную синхронизацию.

Сравнительная таблица: Характеристика SemaphoreSlim Semaphore
Область видимости Внутрипроцессная Межпроцессная (можно именовать)
Производительность Высокая (избегает переключения в режим ядра) Низкая (дорогой системный вызов)
Асинхронная поддержка Есть (WaitAsync()) Нет (только синхронный WaitOne())
Инициализация Только в коде Может быть создан по имени (для общего доступа)
Лимит счетчика int.MaxValue Определяется ОС
Рекомендуемый сценарий Синхронизация потоков внутри приложения Координация работы нескольких процессов или с устаревшим COM-кодом

Пример SemaphoreSlim (ограничение параллелизма):

// Допускаем не более 5 одновременных запросов к внешнему API
private static readonly SemaphoreSlim _throttler = new SemaphoreSlim(5);

public async Task<Data> GetDataAsync()
{
    await _throttler.WaitAsync(); // Асинхронное ожидание
    try
    {
        // Критическая секция с ограниченным параллелизмом
        return await _httpClient.GetFromJsonAsync<Data>(...);
    }
    finally
    {
        _throttler.Release();
    }
}

Пример Semaphore (межпроцессная блокировка):

// Создаём или открываем именованный семафор, доступный всем процессам на машине
using var semaphore = new Semaphore(initialCount: 1, maximumCount: 1, name: "GlobalMyAppSemaphore");
semaphore.WaitOne(); // Блокируем доступ для других процессов
try
{
    // Работа с общим ресурсом (файлом, портом и т.д.)
}
finally
{
    semaphore.Release();
}

Вывод: Для большинства сценариев синхронизации потоков внутри современного .NET-приложения используйте SemaphoreSlim. К Semaphore прибегайте только при необходимости координации между независимыми процессами.