After testing, certain assumptions about SemaphoreSlim have turned out to be false. It is actually faster than our custom attempt at AsyncMutex for the hot path where it is not locked.