锁定语句中不允许使用C#(.NET Async CTP)中的await关键字。
从MSDN:
等待表达式不能用于同步函数,查询表达式,异常处理语句的catch或finally块,锁语句的块或不安全的上下文中。
我认为由于某种原因,对于编译器团队而言,这既困难又不可能。
我尝试了using语句:
class Async
{
public static async Task<IDisposable> Lock(object obj)
{
while (!Monitor.TryEnter(obj))
await TaskEx.Yield();
return new ExitDisposable(obj);
}
private class ExitDisposable : IDisposable
{
private readonly object obj;
public ExitDisposable(object obj) { this.obj = obj; }
public void Dispose() { Monitor.Exit(this.obj); }
}
}
// example usage
using (await Async.Lock(padlock))
{
await SomethingAsync();
}
但是,这无法正常工作。在ExitDisposable.Dispose中对Monitor.Exit的调用似乎无限期(大部分时间)阻塞,导致死锁,因为其他线程试图获取该锁。我怀疑我的工作不可靠,而锁定语句中不允许使用await语句的原因与某种原因有关。
有谁知道为什么在锁语句的主体内不允许等待?