2012-01-16 23 views
8

Modelden veri almak için eylemler kullanan bir Silverlight uygulamasına sahibim (bu da verileri WCF hizmetlerinden alır).Silverlight'ta eylemleri senkronize etme

İki ActionCallback'i bir şekilde eşzamanlamalı veya onları beklemeli ve ardından bir kod yürütmem gerekiyor.

Örnek: Ben geri döndü kaç izlemek için bir sayaç kullanabilirsiniz biliyorum ama bunu yapmak için daha iyi bir yolu yoktur

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

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

doSomethingWhenBothHaveReturned(); 

?

DÜZENLEME: user24601 iyi bir yanıt var, ancak CountdownEvent, gümüş ışığı, başka harika fikirlerde yok mu? :)

+0

Emin değilim, ama [Reaktif Uzantılar] (http://msdn.microsoft.com/en-us/data/gg577609) orada size yardımcı olabileceğini düşünüyorum. –

+0

Hizmetler çağrılar asyncrouns mısınız? – Glenn

+0

Evet, onlar glenn. – randoms

cevap

4

sorunu kendime Çözüldü: 'daha şık' çözüm bir geri sayım olayı kullanmak olacaktır

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

kullanımı:

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

Evet, iyi yakalayın. Silverlight'ta mevcut değil gibi görünüyor. – DanTheMan

9

Evet, ihtiyacınız olan şey budur. Bir sayacını kullanıyor

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

Sanırım bu .net 4 ile doğru bir yaklaşımdır, ancak sınıfın gümüş ışığı için mevcut gibi görünmüyor. – randoms