在Silverlight中同步操作

ran*_*oms 8 c# delegates action

我有一个Silverlight应用程序,它使用操作从模型中获取数据(再次从WCF服务获取数据).

我需要以某种方式同步两个ActionCallbacks,或等待它们,然后执行一些代码.

例:

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

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

doSomethingWhenBothHaveReturned();
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用计数器来记录已经返回的数量,但有没有更好的方法来做到这一点?

编辑: user24601有一个很好的答案,但CountdownEvent不存在silverlight,任何其他伟大的想法?:)

Dan*_*Man 9

是的,你需要一个柜台."更优雅"的解决方案是使用倒计时事件:

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();
}
Run Code Online (Sandbox Code Playgroud)


ran*_*oms 4

我自己解决了这个问题,使用计数器:

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

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;
}
Run Code Online (Sandbox Code Playgroud)