Вимоги: Через обмежені ресурси апаратного забезпечення програма повинна споживати певну кількість апаратних ресурсів, у випадку високої паралелності, якщо деякі методи, що споживають надто багато ресурсів програми, не обмежені (експорт великої кількості даних у таблицю Excel), це може вплинути на нездатність всієї програми надавати нормальні сервіси, а також на нормальну роботу операційної системи.
Різниця семафорів і семафорів
SemaphoreSlim і Semaphore схожі за функціональністю. SemaphoreSlim приблизно в 4 рази швидший за Semaphore, але SemaphoreSlim не може використовуватися для міжпроцесної сигналізації.
Причина підвищення продуктивності полягає в тому, що клас SemaphoreSlim є легкою альтернативою класу Semaphore, який не використовує семафор ядра 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. Wait(0): Метод не буде заблокований. Він перевірить стан ручки очікування і одразу повернеться. Зачекайте: блокує поточний потік, поки він не зможе увійти в SemaphoreSlim, при цьому вказуючи тайм-аут за допомогою 32-бітного знакового цілого числа.
Вихідний код виглядає так:
Зображення такі:
|