Das Schlüsselwort await in C # (.NET Async CTP) ist in einer lock-Anweisung nicht zulässig.
Von MSDN :
Ein Warten-Ausdruck kann nicht in einer synchronen Funktion, in einem Abfrageausdruck, im catch- oder finally-Block einer Ausnahmebehandlungsanweisung, im Block einer lock-Anweisung oder in einem unsicheren Kontext verwendet werden.
Ich gehe davon aus, dass dies für das Compilerteam aus irgendeinem Grund entweder schwierig oder unmöglich zu implementieren ist.
Ich habe versucht, die using-Anweisung zu umgehen:
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();
}
Dies funktioniert jedoch nicht wie erwartet. Der Aufruf von Monitor.Exit in ExitDisposable.Dispose scheint auf unbestimmte Zeit (meistens) zu blockieren, was zu Deadlocks führt, wenn andere Threads versuchen, die Sperre zu erlangen. Ich vermute, dass die Unzuverlässigkeit meiner Arbeit und der Grund, warum Warten-Anweisungen in Lock-Anweisungen nicht zulässig sind, irgendwie zusammenhängen.
Weiß jemand, warum das Warten im Text einer Lock-Anweisung nicht erlaubt ist?