2012-01-16 16 views
8

Ho un'app Silverlight che utilizza le azioni per ottenere dati dal modello (che riceve nuovamente i dati dai servizi WCF).Sincronizzazione delle azioni in Silverlight

Ho bisogno di sincronizzare in qualche modo due ActionCallbacks, o di attendere per loro, e quindi eseguire del codice.

Esempio:

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

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

doSomethingWhenBothHaveReturned(); 

So che posso utilizzare un contatore per tenere traccia di quante è tornato, ma non esiste un modo migliore per fare questo?

MODIFICA: user24601 ha una buona risposta, ma CountdownEvent non esiste in silverlight, altre grandi idee? :)

+0

Non sono sicuro, ma Penso che [Reactive Extensions] (http://msdn.microsoft.com/en-us/data/gg577609) potrebbe aiutarti. –

+0

Le chiamate ai servizi asyncrouns? – Glenn

+0

Sì, sono glenn. – randoms

risposta

4

risolto il problema la mia auto, utilizzando un contatore:

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(); 
     } 
    } 
} 

utilizzo:

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ì, buona presa. Sembra che non sia disponibile su Silverlight. – DanTheMan

9

Sì, un contatore è quello che ti serve. La soluzione 'più elegante' sarebbe quella di utilizzare un evento di conto alla rovescia:

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

Immagino che questo sia l'approccio giusto con .net 4, ma non sembra che la classe sia disponibile per Silverlight. – randoms

Problemi correlati