Лучший способ "блокировать" до тех пор, пока не будет выполнено определенное условие

Я хотел бы создать некоторый метод, который будет использоваться общим способом, если бы он блокировал (если не истекает определенный тайм-аут) до тех пор, пока не будет выполнено заданное условие.

Использование в коде было бы похоже на:

WaitUntil( condition );

Я попытался реализовать его, используя цикл While (..), однако это кажется пустой тратой.

В текущей реализации я инициализирую "одноразовый" таймер, который истекает в TIMEOUT. Я запускаю цикл while и проверяю, был ли таймер отключен или нет, выбрасывая исключение, если это произошло.

Существуют ли какие-либо простые, но эффективные методы для реализации такого метода?

Ответ 1

Блокировка для условия может работать (я обычно использую Monitor для этого лично), однако в большинстве случаев я бы советовал кодирование более асинхронным образом здесь, а это означает: вместо ожидания вы регистрируете какой-то обратный вызов когда условие происходит. Это может быть событие или последнее задание с продолжением (ContinueWith). В С# 5 это дополнительно расширяется метафорой "ожидание", которая делает это прозрачным, I.e.

var foo = StartSomeWork();
...
var result = await foo;
Console.WriteLine(result);

Этот выглядит, как будто он блокируется при "ожидании", но на самом деле это абсолютно противоположное (если задача еще не завершена); это регистрирует продолжение, которое вызывается, когда данные становятся доступными, скорее всего, в другом потоке.