2012-01-07 2 views
10

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

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

WaitUntil(condition); 

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

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

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

+0

Я бы рассмотрел делегаты и события – Joe

+3

Мьютекс, Семафор, ManualResetEvent, AutoResetEvent, CountdownEvent и т. Д. Посмотрите на пространство имен System.Threading –

+3

Говоря более технически, вы хотите что-то синхронизировать. Операционная система предоставляет механизмы, которые позволяют избежать ожидания в цикле while. Yoy имеет несколько вариантов: семафор, критический раздел, событие ручного/автоматического сброса и многое другое. Чтобы выбрать один, вы должны сказать, какое условие вы ожидаете. Одной из общих функций для синхронизации является WaitForSingleObject. – pkmiec

ответ

4

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

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

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

+1

+1 для упоминания async – diggingforfire

+0

Единственная проблема с этим кодом: мы используем .NET 3.5, а версия 5 еще не закончилась :) работает ли CTP на 3.5? (я так не думаю). –

+0

@liortal вы можете использовать ContinueWith on 4.0; Я бы не использовал CTP для производственного кода –