Ответ
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 прибегайте только при необходимости координации между независимыми процессами.