2012-01-07 11 views
10

Me gustaría crear algún método para usarlo de forma genérica, si se bloqueara (a menos que caduque cierto tiempo de espera) hasta que se cumpla una condición dada.El mejor método para "bloquear" hasta que se cumpla determinada condición

El uso de código sería algo similar a:

WaitUntil(condition); 

He intentado implementarlo usando un tiempo (..) de bucle, sin embargo, esto parece un desperdicio.

En la implementación actual, estoy inicializando un temporizador 'único' que expira en TIMEOUT. Estoy ejecutando un ciclo while, y comprobando si el temporizador ha expirado o no, lanzando una excepción si lo hizo.

¿Existen técnicas simples pero efectivas para implementar dicho método?

+0

Me gustaría ver los delegados y eventos – Joe

+3

Mutex, Semaphore, ManualResetEvent, AutoResetEvent, CountdownEvent etc. Consulte el espacio de nombres System.Threading –

+3

diciendo más técnicamente que desea sincronizar en algo. El sistema operativo proporciona mecanismos que permiten evitar la espera ocupada en el ciclo while. Tienen varias opciones: semáforo, sección crítica, evento manual/reinicio automático y más. Para elegir uno, debe decir cuál es la condición que está esperando. Una función genérica para la sincronización es WaitForSingleObject. – pkmiec

Respuesta

4

El bloqueo de una condición puede funcionar (tiendo a usar Monitor para eso personalmente), sin embargo, en la mayoría de los casos recomendaría la codificación de una manera más asincrónica aquí, lo que significa: en lugar de esperar, registrará algún tipo de devolución de llamada a ocurrir cuando la condición ocurre. Esto podría ser a través de un evento o, más recientemente, una Tarea con continuación (ContinueWith). En C# 5, esto se amplía con la metáfora de "esperar" que lo haga transparente, es decir

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

Esto se ve como que está bloqueando en la "espera" -, pero en realidad es exactamente lo contrario (si se asume la tarea no está completa); esto registra una continuación que se invoca cuando los datos están disponibles, muy probablemente en un hilo diferente.

+1

+1 por mencionar async – diggingforfire

+0

El único problema con este código es: estamos utilizando .NET 3.5, y la versión 5 aún no ha salido :) ¿funciona el CTP en 3.5? (No lo creo). –

+0

@liortal puede usar ContinueWith en 4.0; No usaría el CTP para el código de producción –

Cuestiones relacionadas