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

Gra*_*pes 10 c# asynchronous async-await

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

async Task BasicProcess() {
    // await time consuming task
}
Run Code Online (Sandbox Code Playgroud)

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

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

async Task BasicProcess() {
    lock (BasicProcessLock) {
         // await time consuming task
    }
}
Run Code Online (Sandbox Code Playgroud)

ila*_*sch 30

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

private SemaphoreSlim _syncLock = new SemaphoreSlim(1);
Run Code Online (Sandbox Code Playgroud)

然后在你的代码中做:

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

 }
Run Code Online (Sandbox Code Playgroud)

  • 把它放在试一试/最后安全也是有益的.这样你就可以保证获得一个发布调用,即使"//你的东西"会引发异常. (7认同)
  • 除了这将阻止调用线程,这是不理想的,如果它真的是异步的. (3认同)