Лучший способ «заблокировать», пока не будет выполнено определенное условие - PullRequest
10 голосов
/ 07 января 2012

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

Использование в коде было бы чем-то похожимto:

WaitUntil( condition );

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

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

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

Ответы [ 2 ]

10 голосов
/ 07 января 2012

Взгляните на статью Албахари о потоках , особенно на basic synchronization и ManualResetEvent и AutoResetEvent . Это даст вам хорошее представление о сигнальных конструкциях в .NET.

4 голосов
/ 07 января 2012

Блокировка для условия может работать (я обычно использую Monitor для этого лично), однако, в большинстве случаев я бы посоветовал кодировать здесь более асинхронно, что означает: вместо ожидания вы регистрируете некоторый обратный вызов когда условие происходит. Это может быть событие, или совсем недавно Задача с продолжением (ContinueWith). В c # 5 это еще более расширено метафорой «await», которая делает это прозрачным, т.е.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...