La palabra clave de espera en C # (.NET Async CTP) no está permitida desde una declaración de bloqueo.
De MSDN :
Una expresión en espera no se puede utilizar en una función síncrona, en una expresión de consulta, en el bloque catch o finalmente de una declaración de manejo de excepciones, en el bloque de una declaración de bloqueo o en un contexto inseguro.
Supongo que esto es difícil o imposible de implementar por el equipo del compilador por alguna razón.
Intenté solucionar el problema con la instrucción 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();
}
Sin embargo, esto no funciona como se esperaba. La llamada a Monitor.Exit dentro de ExitDisposable.Dispose parece bloquearse indefinidamente (la mayoría de las veces) causando puntos muertos a medida que otros hilos intentan adquirir el bloqueo. Sospecho que la falta de confiabilidad de mi trabajo y la razón por la cual las declaraciones no están permitidas en la declaración de bloqueo están de alguna manera relacionadas.
¿Alguien sabe por qué esperar no está permitido dentro del cuerpo de una declaración de bloqueo?