3

迭代器异步方法都创建了一个状态机,用于保持 yield/await 操作之间的状态,并且方法中的每个本地都成为该状态机类型实例中的一个字段。

这个演讲中,Stephen Toub 谈到如果你有很多 await 调用,在异步方法的主体中减少局部变量是一种有效的(非微)优化。(即,如果您在循环中等待)

所以在这种情况下,我想知道拥有 7 个本地人和拥有一个本地人(即Tuple<T1, T2, T3, T4, T5, T6, T7>.

显然,如果迭代器中只有一个yield或 async 方法中只有一个await ,它只会使事情复杂化,但是当涉及到数千个或更多时,您是否认为使用元组(或任何其他可以包装您的字段的类型) 有什么好处吗?

或者这只是另一种微优化尝试,什么也没做或使用太少?

编辑:现在我又想到了,我想如果它有任何好处的话,它已经以这种方式实施了。尽管如此,我仍然对此感到好奇。

4

1 回答 1

2

如果你有成千上万的等待/产量,那么事情已经很不对劲了。还应注意,两者具有不同的实现方式。但是,更改为元组并没有添加任何有用的东西,IMO。无论该引用是否为:

  • 迭代器实例
  • 捕获的变量上下文
  • 一个元组
  • 元组捕获变量上下文

但是通过使用元组,您可以保证在需要改变变量的任何时候都需要一个新实例。

Tulle在手动实现异步时更有趣(例如 ContinueWith),但我真的认为在使用编译器提供实现时不值得。

于 2012-10-20T07:49:16.380 回答