C # (. NET Async CTP)의 await 키워드는 잠금 명령문 내에서 허용되지 않습니다.
에서 MSDN :
대기 표현식은 동기식 함수, 쿼리 표현식, 예외 처리 명령문의 catch 또는 finally 블록 , lock 문 블록 또는 안전하지 않은 컨텍스트에서 사용될 수 없습니다 .
컴파일러 팀이 어떤 이유로 구현하기가 어렵거나 불가능하다고 가정합니다.
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에 대한 호출은 다른 스레드가 잠금을 획득하려고 시도 할 때 교착 상태를 일으키는 무한정 (대부분) 차단되는 것으로 보입니다. 나는 내 작업의 신뢰성이 의심스럽고 잠금 진술에서 대기 진술이 허용되지 않는 이유는 어떻게 든 관련이 있다고 생각합니다.
누구든지 잠금 문의 본문 내에서 대기가 허용되지 않는 이유를 알고 있습니까?