当使用 async/await 关键字访问 C# 中的临界区时,通常不建议使用lock关键字或Monitor (为什么我不能在 lock 语句的主体中使用 'await' 运算符?),因为它会在这种情况下引入死锁其中锁定关键部分的线程可能不可用。
一般方法是使用SemaphoreSlim
类。
我的问题是,既然SemaphoreSlim(1,1)
和 lock 在功能上是相同的,为什么使用一个可以,但另一个会引入死锁?
是因为 SemaphoreSlim 可以从任何线程释放,而锁则由锁定它的线程独占“拥有”吗?