2012-01-16 8 views
8

アクションを使用してモデルからデータを取得するSilverlightアプリケーションがあります(WCFサービスからデータを再度取得します)。Silverlightでのシンクロナイズアクション

何とか2つのActionCallbacksを同期させるか、またはそれらを待ってから、いくつかのコードを実行する必要があります。

例:私は戻ってきたどのように多くを追跡するためにカウンタを使用することができます知っているが、これを行うには良い方法はありません

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

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

doSomethingWhenBothHaveReturned(); 

編集: user24601は良い答えがありますが、CountdownEventはSilverlight、他の素晴らしいアイデアにはありませんか? :)

+0

わからないが、しかし、私は[Reactive Extensions](http://msdn.microsoft.com/en-us/data/gg577609)があなたに役立つと思う。 –

+0

サービスasyncrounsへのコールはありますか? – Glenn

+0

はい、彼らはグレンです。 – randoms

答えて

4

は、カウンタを使用して、私の自己の問題を解決し

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

ええ、良いキャッチ。 Silverlightでは利用できません。 – DanTheMan

9

はい、カウンターが必要です。 'よりエレガントな' ソリューションは、カウントダウンイベントを使用することです:

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

用法:

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

これは.net 4の正しいアプローチだと思いますが、クラスが銀色のために利用できるようには見えません。 – randoms

関連する問題