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,任何其他伟大的想法?:)
是的,你需要一个柜台."更优雅"的解决方案是使用倒计时事件:
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)
我自己解决了这个问题,使用计数器:
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)