Синхронный
lock не работает с async/await, и многие пытаются заменить его чем угодно, лишь бы компилилось. Правильный путь — использовать SemaphoreSlim с WaitAsync, как на примере: он позволяет ограничивать конкуренцию и работает корректно в асинхронном коде.Главное — всегда освобождать семафор в
finally и не забывать про таймауты, чтобы не создавать висячие блокировки.Асинхронная синхронизация — это не магия, а аккуратность и понимание того, как работает планировщик задач в .NET.
