Sincronizzare le azioni in Silverlight

Ho un’applicazione Silverlight che utilizza le azioni per ottenere dati dal modello (che riceve nuovamente i dati dai servizi WCF).

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

Esempio:

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

So che posso usare un contatore per tenere traccia di quanti ne sono tornati, ma non c’è un modo migliore per farlo?

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

Sì, un contatore è ciò di cui hai bisogno. La soluzione “più elegante” sarebbe 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(); } 

Risolto il problema da solo, usando 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; }