Le mot clé await en C# (.NET Async CTP) n'est pas autorisé à partir à l'intérieur d'une instruction lock.
À partir de MSDN:
Un attendent expression ne peut pas être utilisé dans une fonction synchrone, dans une requête l'expression, dans le bloc catch ou finally d'un traitement d'exception déclaration, dans le bloc de verrouillage de l'instruction, ou dans un contexte dangereux.
Je suppose que c'est soit difficile, voire impossible, pour le compilateur de l'équipe à mettre en œuvre pour une raison quelconque.
J'ai tenté un travail autour avec l'aide de déclaration:
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();
}
Toutefois, cela ne fonctionne pas comme prévu. L'appel à Surveiller.Sortie dans ExitDisposable.Jetez semble bloquer indéfiniment (la plupart du temps) provoquant des blocages que d'autres threads tentent d'acquérir le verrou. Je soupçonne que le manque de fiabilité de mon travail autour de et la raison pour attendre les instructions ne sont pas autorisés dans le verrouillage de la déclaration sont en quelque sorte liés.
Personne ne sait pourquoi attendre n'est pas autorisé dans le corps d'une instruction lock?