Ключевое слово ожидания в С# (.NET Async CTP) не допускается из инструкции блокировки.
От MSDN:
выражение ожидания не может использоваться в синхронной функции, в запросе выражение в блоке catch или finally обработки исключений оператора в блоке оператора блокировки или в небезопасном контексте.
Я предполагаю, что это сложно или невозможно для команды компилятора по какой-либо причине.
Я попытался работать с использованием инструкции:
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();
}
Однако это не работает должным образом. Вызов Monitor.Exit в ExitDisposable.Dispose, кажется, блокируется бесконечно (большую часть времени), вызывая взаимоблокировки, когда другие потоки пытаются получить блокировку. Я подозреваю, что ненадежность моей работы и аргументы ожидания ожидания не допускаются в инструкции блокировки, как-то связаны.
Кто-нибудь знает, почему ожидание не допускается в теле оператора блокировки?