作为一个更具体的例子 - 我有一个游戏循环,我希望有一个方法来处理动画。
为了这个例子,这个动画是对运动功能的调用。
有没有一种方法可以调用这个功能并让它做...当动画自动完成时?
更基本的实现是让它在完成时返回一个值,并让调用者不断检查这一点,但我似乎记得有更优雅的技巧。
我对协同例程或yield关键字一无所知。他们可能在这里有关系吗?
答案 0 :(得分:3)
答案主要是:取决于
如果代码是,正如你所说,一个简单的方法调用(你无法控制),并且该方法调用正在循环中运行(而不是长时间运行),你几乎被卡住了使用"检查返回值"方法
如果它只是一个功能,但是长时间运行,你可以传递一个回调。您的功能签名变为:
public void foo MyFunc(Action callback)
{
...
callback();
}
您可以使用Action
委托来调用它(当然,只要您更新函数签名,任何其他委托都可以。)操作完成后,foo
将调用回调。这通常在线程环境中完成,因为您可以等待调用在单个线程上返回。
在线程环境中,如果线程终止与您的"完成"一致,您也可以等待线程Join
。条件。
在最好的情况下,此功能被封装到一个类中,该类管理循环方法调用之间的状态。在这种情况下,您可以简单地引发一个使用类在操作完成时注册的事件。
最后一个是最详细的选项,但允许循环调用(如在游戏循环中)或线程,并且可以在完成时调用多个函数。如果在您的用例中有意义,我会选择此选项。
答案 1 :(得分:0)
如果您希望函数在完成时执行某些操作,请尝试使用回调:http://en.wikipedia.org/wiki/Callback_(computer_programming)
看起来像是:
public void Animate(Function foo)
{
// Animate
foo();
}