c#中的await关键字。NET Async CTP)不允许在锁语句中使用。
从MSDN:
< p > < >强 Await表达式不能用于同步函数和查询中的 表达式,在异常处理的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();
}
然而,这并没有像预期的那样工作。对Monitor的调用。在ExitDisposable中退出。Dispose似乎无限期地阻塞(大多数时间),当其他线程试图获得锁时,会导致死锁。我怀疑我周围工作的不可靠性和原因等待语句不允许在锁语句以某种方式相关。
有人知道为什么 await在锁语句体中是不允许的吗?