Lock 和 SemaphoreSlim 使用 async/await 的区别

Анд*_*ков 11 c# multithreading locking async-await

当使用 async/await 关键字访问 C# 中的临界区时,通常不建议使用lock关键字或Monitor (为什么我不能在 lock 语句的主体中使用 'await' 运算符?),因为它会在这种情况下引入死锁其中锁定关键部分的线程可能不可用。

一般方法是使用SemaphoreSlim类。

我的问题是,既然SemaphoreSlim(1,1)和 lock 在功能上是相同的,为什么使用一个可以,但另一个会引入死锁?

是因为 SemaphoreSlim 可以从任何线程释放,而锁则由锁定它的线程独占“拥有”吗?

The*_*ias 2

是因为SemaphoreSlim可以从任何线程释放,而lock由锁定它的线程独占“拥有”吗?

是的,就是这个原因。是lock线程仿射的,而SemaphoreSlim不是。不SemaphoreSlim关心哪个线程释放它。相反,如果您在退出之前设法切换到另一个线程,lock则会抛出。但您不能这样做,因为 C# 语言不允许在.SynchronizationLockExceptionlockawaitlock