A palavra-chave wait em C # (.NET Async CTP) não é permitida em uma instrução de bloqueio.
Do MSDN :
Uma expressão de espera não pode ser usada em uma função síncrona, em uma expressão de consulta, no bloco catch ou finalmente de uma instrução de tratamento de exceção, no bloco de uma instrução de bloqueio ou em um contexto não seguro.
Suponho que isso seja difícil ou impossível para a equipe do compilador implementar por algum motivo.
Tentei uma solução alternativa com a instrução 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();
}
No entanto, isso não funciona conforme o esperado. A chamada para Monitor.Exit em ExitDisposable.Dispose parece bloquear indefinidamente (na maioria das vezes) causando bloqueios, enquanto outros threads tentam adquirir o bloqueio. Suspeito que a falta de confiabilidade do meu trabalho e a razão pela qual as instruções de espera não são permitidas na instrução de bloqueio estejam de alguma forma relacionadas.
Alguém sabe por que esperar não é permitido no corpo de uma declaração de bloqueio?