C#async / await - 限制对异步方法/锁定的调用次数

时间:2013-07-23 05:19:25

标签: c# asynchronous async-await

我来自C ++世界所以我非常习惯锁定线程和互斥锁防护。假设这个基本功能:

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

如何锁定此功能,以便一次只能运行一个BasicProcess

这就是我想要实现的目标:

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

1 个答案:

答案 0 :(得分:30)

你可以使用SemaphoreSlim(1),用(1)创建的SemaphoreSlim将确保只有一个线程可以获得锁定,任何其他尝试获取锁定的线程 - 将等到获得锁定的线程 - 释放它。
创建一个私人成员:

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();

 }