С# async/await - ограничение количества вызовов методов/блокировки async

Я пришел из мира С++, поэтому я очень привык к блокированию потоков и защите мьютексов. Предполагая эту основную функцию:

async Task BasicProcess() {
    // await time consuming task
}

Как заблокировать эту функцию, так что только один BasicProcess может запускаться за один раз?

Этого я хочу достичь:

async Task BasicProcess() {
    lock (BasicProcessLock) {
         // await time consuming task
    }
}

Ответ 1

Вы можете использовать SemaphoreSlim (1) для этого, СемафорСлим, созданный с помощью (1), гарантирует, что только один поток может получить блокировку, любые другие потоки, которые пытаются получить блокировку, - будут ждать, пока тот, кто ее получил, отпустите его.
создайте частного участника:

private SemaphoreSlim _syncLock = new SemaphoreSlim(1);

Затем в вашем коде выполните:

async Task BasicProcess() {

     await _syncLock.WaitAsync(); //Only 1 thread can access the function or functions that use this lock, others trying to access - will wait until the first one released.
     //Do your stuff..
     _syncLock.Release();

 }