【问题标题】:What is the most elegant way of encapsulating a multi-step calculation?封装多步计算的最优雅方式是什么?
【发布时间】:2014-07-08 22:20:20
【问题描述】:

作为一个更具体的例子 - 我有一个游戏循环,我想要一个方法来处理动画。

就本示例而言,此动画是对运动函数的调用。

有没有一种方法可以调用这个函数并让它做......当动画自动完成时?

更基本的实现是让它在完成时返回一个值,并让调用者不断检查这一点,但我似乎记得还有更优雅的技巧。

我对协同程序或 yield 关键字一无所知。它们在这里是否相关?

【问题讨论】:

  • 可以使用await来模拟协程。 await 不会启动新线程,也不会阻塞。
  • 你能给出一个实际的代码示例吗?我可以想到一个复合模式,但这可能不适用

标签: c# encapsulation coroutine yield-return


【解决方案1】:

答案主要是:视情况而定

如果代码,如您所说,是一个简单的方法调用(您无法控制),并且该方法调用正在循环中运行(而不是长时间运行),那么您几乎陷入困境使用“检查返回值”方法。

如果它只是一个函数,但是是长时间运行的,你可以给它传递一个回调。您的函数签名变为:

public void foo MyFunc(Action callback)
{
   ...
   callback();
}

您可以使用Action 委托来调用它(当然,只要您更新函数签名,任何其他委托都可以)。当操作完成时,回调将由foo 调用。这通常在线程环境中完成,因为您可以等待调用在单个线程上返回。

在线程环境中,如果线程终止符合您的“完成”条件,您也可以等待线程到达Join

在最好的情况下,此功能被封装到一个类中,该类管理循环方法调用之间的状态。在这种情况下,您可以简单地在操作完成时引发使用类注册的事件。

最后一个是最冗长的选项,但允许循环调用(如在游戏循环中)或线程,并且可以在完成时调用多个函数。如果在您的用例中有意义,我会选择此选项。

【讨论】:

  • 难道给出的示例仍然会占用代码的执行吗?例如,如果 foo 有一个大循环。我基本上只是想启动一些可以自行处理的东西,然后在完成后回调。我得到了回调部分,但我怎样才能让某些东西处于运动状态,但在完成之前不让它保持控制?
  • @SirYakalot 在自己的线程上启动它(因此有关它通常在线程环境中完成的评论)。这将完全完成您刚才描述的操作。见msdn.microsoft.com/en-us/library/a9fyxz7d(v=vs.110).aspx
  • @SirYakalot 我注意到您不接受我的回答。如果我可以提供任何其他信息,请告诉我。在自己的线程中启动你的函数(并传递回调)应该会让你到达你想要去的地方。
【解决方案2】:

如果您希望函数在完成时执行某些操作,请尝试使用回调:http://en.wikipedia.org/wiki/Callback_(computer_programming)

它看起来像:

public void Animate(Function foo)
{
    // Animate
    foo();
}

【讨论】:

  • 您也应该使用有效的 C# :)。我同意它不是仅链接的答案。
猜你喜欢
  • 1970-01-01
  • 2013-09-29
  • 1970-01-01
  • 2012-04-27
  • 2015-03-29
  • 2010-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多