2013-07-23 82 views
10

我来自C++世界,所以我非常习惯于锁定线程和互斥锁。假设这个基本功能:C#异步/等待 - 限制异步方法调用/锁定

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

怎样才能锁定这个功能,所以只有一个BasicProcess可以在同一时间运行?

这就是我想要达到的目标:

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

见http://blogs.msdn.com/b/pfxteam/archive/2012/02/12/10266988 .aspx的AsyncLock实现。 –

回答

29

您可以使用SemaphoreSlim(1)对于这一点,与创建的SemaphoreSlim(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(); 

} 
+2

除了现在会阻止调用线程,这并不理想,如果它真的是异步的。 –

+0

更好地使用“await _syncLock.WaitAsync();” - 否则,线程将被阻塞,任务将不会运行。 – jlahd

+0

Jon/jlahd - 谢谢你的更新,以免阻挡。 – ilansch