Le mot clé wait en C # (.NET Async CTP) n'est pas autorisé à partir d'une instruction de verrouillage.
Depuis MSDN :
Une expression d'attente ne peut pas être utilisée dans une fonction synchrone, dans une expression de requête, dans le bloc catch ou finally d'une instruction de gestion des exceptions, dans le bloc d'une instruction lock ou dans un contexte non sécurisé.
Je suppose que cela est difficile ou impossible pour l'équipe de compilation à implémenter pour une raison quelconque.
J'ai tenté une solution de contournement avec l'instruction 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();
}
Cependant, cela ne fonctionne pas comme prévu. L'appel à Monitor.Exit dans ExitDisposable.Dispose semble se bloquer indéfiniment (la plupart du temps) provoquant des blocages lorsque d'autres threads tentent d'acquérir le verrou. Je soupçonne le manque de fiabilité de mon travail et la raison pour laquelle les déclarations d'attente ne sont pas autorisées dans la déclaration de verrouillage sont en quelque sorte liées.
Quelqu'un sait-il pourquoi l' attente n'est pas autorisée dans le corps d'une instruction de verrouillage?