2012-01-16 12 views
8

Tengo una aplicación Silverlight que usa acciones para obtener datos del modelo (que nuevamente obtiene los datos de los servicios de WCF).Acciones de sincronización en Silverlight

Necesito sincronizar de alguna manera dos ActionCallbacks, o esperar por ellos, y luego ejecutar algún código.

Ejemplo:

_model.GetMyTypeList(list => 
{ 
    MyTypeList.AddRange(list); 
}); 

_model.GetStigTypeList(list => 
{ 
    StigTypeList.AddRange(list); 
}); 

doSomethingWhenBothHaveReturned(); 

Sé que puedo utilizar un contador para llevar la cuenta de cuántas ha vuelto, pero ¿no hay una mejor manera de hacer esto?

EDIT: user24601 tiene una buena respuesta, pero CountdownEvent no existe en silverlight, ¿alguna otra idea genial? :)

+0

No estoy seguro, pero Creo que [Reactive Extensions] (http://msdn.microsoft.com/en-us/data/gg577609) podría ayudarlo allí. –

+0

¿Las llamadas a los servicios son asíncrouns? – Glenn

+0

Sí, están glenn. – randoms

Respuesta

4

resuelto el problema de mi auto, utilizando un contador:

public class ActionWaitHandler 
{ 
    private int _count; 
    private readonly Action _callback; 

    public ActionWaitHandler(int count, Action callback) 
    { 
     _count = count; 
     _callback = callback; 
    } 

    public void Signal() 
    { 
     _count--; 
     if (_count == 0) 
     { 
      _callback(); 
     } 
    } 
} 

uso:

public void method() { 
    var handler = new ActionWaitHandler(2, OnActionsComplete); 

    _model.GetMyTypeList(list => 
    { 
     MyTypeList.AddRange(list); 
     handler .Signal(); 
    }); 

    _model.GetStigTypeList(list => 
    { 
     StigTypeList.AddRange(list); 
     handler .Signal(); 
    }); 
} 

public void OnActionsComplete() 
{ 
    dosomething; 
} 
+1

Sí, buena captura. Parece que no está disponible en Silverlight. – DanTheMan

9

Sí, un contador es lo que necesita. La solución 'más elegante' sería el uso de un evento de cuenta regresiva:

using (CountDownEvent countDownEvent = new CountDownEvent(2)) 
{ 
    _model.GetMyTypeList(list => 
    { 
     MyTypeList.AddRange(list); 
     countDownEvent.Signal(); 
    }); 

    _model.GetStigTypeList(list => 
    { 
     StigTypeList.AddRange(list); 
     countDownEvent.Signal(); 
    }); 

    countdownEvent.Wait(); 
    doSomethingNowThatWereComplete(); 
} 
+1

Supongo que este es el enfoque correcto con .net 4, pero no parece que la clase esté disponible para Silverlight. – randoms