La parola chiave wait in C # (.NET Async CTP) non è consentita all'interno di un'istruzione lock.
Da MSDN :
Un'espressione waitit non può essere utilizzata in una funzione sincrona, in un'espressione di query, nel blocco catch o infine di un'istruzione di gestione delle eccezioni, nel blocco di un'istruzione lock o in un contesto non sicuro.
Presumo che questo sia difficile o impossibile per il team del compilatore per qualche motivo.
Ho tentato di aggirare l'istruzione 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();
}
Tuttavia, questo non funziona come previsto. La chiamata a Monitor.Exit in ExitDisposable.Dispose sembra bloccarsi indefinitamente (la maggior parte delle volte) causando deadlock mentre altri thread tentano di acquisire il blocco. Sospetto che l'inaffidabilità del mio lavoro in giro e il motivo per cui le dichiarazioni di attesa non sono consentite nell'istruzione lock sono in qualche modo correlate.
Qualcuno sa perché waitit non è consentito nel corpo di un'istruzione lock?