【发布时间】:2013-11-18 09:53:50
【问题描述】:
我正在开发一个多线程 WindowsPhone8 应用程序,该应用程序在异步方法中具有关键部分。
有没有人知道在 C# 中正确使用信号量/互斥锁的方法,您使用的是嵌套异步调用,其中内部方法可能会获取它已经在调用堆栈中获取的相同锁?我认为 SemaphoreSlim 可能是答案,但看起来它会导致死锁。
public class Foo
{
SemaphoreSlim _lock = new SemaphoreSlim(1);
public async Task Bar()
{
await _lock.WaitAsync();
await BarInternal();
_lock.Release();
}
public async Task BarInternal()
{
await _lock.WaitAsync(); // deadlock
// DO work
_lock.Release();
}
}
【问题讨论】:
-
递归锁定通常被认为是一种不好的做法。难道你不能只是重组你的代码,这样就不会发生吗?
-
在这种特殊情况下它不依赖于 async/await。这段代码在任何情况下都会陷入死锁,只是因为它一次又一次地尝试获取锁两次。是的,它们可以在不同的线程中执行(因为 async/await 是在线程池上执行的),但它们会依次执行。
标签: c# windows-phone-8 async-await semaphore