【问题标题】:C# Why shouldn't I ever use coroutines?C# 为什么我不应该使用协程?
【发布时间】:2016-06-19 10:03:43
【问题描述】:

本帖的一位cmet:Checking condition and calling continuous method with periods of delay unity,说:

永远不要使用协程。他们从 c# 开发人员的角度教坏习惯,如果你从事常规 c# 工作会导致私刑

我的问题是,这是为什么呢?这只是在 Unity 中还是在一般情况下? Unity 的官方虚拟现实示例https://www.assetstore.unity3d.com/en/#!/content/51519 大量使用它们(尤其是传单示例),而不是 Invoke 或 Invoke Repeating,这些示例项目最近也发布了。

【问题讨论】:

  • 嗨 Martin,除了 Cory 的解释之外,很简单 对于初学者 在 99% 的情况下,人们使用协程的唯一原因是,令人难以置信简而言之,他们没有意识到存在 Invoke 和 InvokeRepeating 调用,或者其次,他们只是不知道 Update 调用,在 Unity 中。老实说就是这么简单。请注意(如果您是专家)您必须在适当的地方使用 Invoke/Repeating,并且您完全理解 Update 和 Coroutine 是同样的事情
  • 打个比方,有点像c中的“++”运算符。 (a) 这是一个非常糟糕的想法,是软件工程中最糟糕的想法 (b) 1000 名业余爱好者初学者,也许有 2 人知道这意味着什么,++a 和 a++ 之间的区别,以及其他细微之处 (c) 当然,有时专家会将其用作一种速记来表示算法等。
  • (你提到“unity的lol样本”,所有的unity文档和样本都不是开玩笑的,是毫无价值的行业传奇。还要注意这是一个虚拟现实样本,看在上帝的份上:99.999% 的 beginner 与“协程!”相关的问题是这样的:stackoverflow.com/a/35807346/294884)

标签: c# unity3d coroutine


【解决方案1】:

这在很大程度上是 Unity 的事情,尽管该建议适用于任何地方。

开发人员不希望通过迭代 IEnumerable 来更改程序的状态。这不是 IEnumerable 的用途,并且是与所有 .NET 不一致的行为。

Unity 正在做的是将yield return 用作伪协程,这会让任何不熟悉它的开发者感到困惑。

在现代 C# 中,我们使用 async/await 来完成 Unity 的意图,但 Unity 是在该功能可用之前制作的。

【讨论】:

  • 虽然使用yield 构建协程非常容易,但您将如何使用async/await 构建它?有趣的是,wikiyield 模式列为半协程模式,但没有列出async/await
  • Cory,尽管 Unity 是一个基于 ECS 框架的系统,但请牢记。他们有点“扭曲”整个事情的意思,只不过是“转到下一帧”。 (我不知道它为什么存在,因为 Update 是相同的......即访问下一帧;当然,这很方便,但混乱值得吗?)您当然非常正确,99% 的人认为“协程!”在 Unity 中与 threading/timing/waiting 有关。当然,协程与这些问题完全无关。
  • @Fattie 我并没有暗示协程本质上与线程/定时/等待有关。那是不正确的。
  • 嘿 cory :) 两年后...老实说,我已经失去了讨论的线索。 “在现代 C# 中,我们使用 async/await 来完成 Unity 的意图”...... Unity 是一个基于 帧的引擎,它是一个完全不同的环境。无论如何欢呼
猜你喜欢
  • 2010-12-22
  • 2010-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-30
  • 2016-05-23
相关资源
最近更新 更多