Требования: Из-за ограниченных ресурсов аппаратного обеспечения программа должна потреблять определённое количество аппаратных ресурсов в случае высокой параллелности, если некоторые методы, потребляющие слишком много ресурсов программы, не ограничены (экспорт большого объёма данных в таблицу Excel), это может повлиять на неспособность всей программы предоставлять нормальные сервисы, а также на нормальную работу операционной системы.
Разница семафора и семафора Slim
SemaphoreSlim и Semaphore похожи по функционалу. SemaphoreSlim примерно в 4 раза быстрее Semaphore, но SemaphoreSlim не может использоваться для межпроцессной сигнализации.
Причина повышения производительности заключается в том, что класс SemaphoreSlim предоставляет лёгкую альтернативу классу семафоров, который не использует семафор ядра Windows. По сути, если вам не нужно называть семафоры, используйте класс SemaphoreSlim.
SemaphoreSlim основан на SpinWait и Monitor, поэтому поток, ожидающий блокировки, занимает определённый цикл процессора, надеясь получить блокировку перед тем, как уступить место другому потоку. Если этого не происходит, поток позволяет системе переключиться в контекст и попробовать снова, когда ОС снова запланирует этот поток (за счёт использования нескольких циклов процессора). Если ожидание долгое, этот режим может потреблять много циклов процессора. Лучший вариант для такой реализации — чаще всего нет времени ожидания, и блокировка можно получить почти сразу. Semaphore опирается на реализации в ядре ОС, поэтому при каждом получении блокировки требуется довольно много циклов процессора, но после этого поток просто уходит в спячку, чтобы получить время, необходимое для получения блокировки.
Документация по семафорам:https://docs.microsoft.com/en-us ... aphore?view=net-6.0 Документация SemaphoreSlim:https://docs.microsoft.com/en-us ... reslim?view=net-6.0
Перед выполнением метода наиболее часто используемые методы ожидания следующимиЗвоните в соответствии с реальной ситуацией вашего бизнеса!
Wait(): Блокирует поток, пока он не войдёт в SemaphoreSlim. Подожди(0): Метод не будет заблокирован. Он проверит состояние ручки ожидания и сразу же вернётся. Ожидание: блокирует текущий поток, пока он не сможет войти в SemaphoreSlim, при этом указывает тайм-аут с помощью 32-битного знакового целого числа.
Исходный код следующий:
Визуализации следующие:
|