If you have an asynchronization method, you want, if possible, to avoid any blocking calls. SemaphoreSlim.Wait()- blocking call. So what happens if you use Wait()and the semaphore is not available at the moment? It will block the caller, which is very unexpected for asynchronous methods:
var myTask = Get();
var myString = await Get();
If you use WaitAsync- it will not block the caller if the semaphore is not available at the moment.
var myTask = Get();
// can continue with other things, even if semaphore is not available
async\await. :
result = await this.GetStringAsync();
await, , , , , , . , , ( , Monitor.Enter, ReaderWriterLock ..).