如何(应该是一个?)从Dart的await-for循环中取消流?

时间:2019-08-15 13:06:38

标签: dart

我对Dart流有一个疑问,如下所示。当我通过其listen()方法使用Stream时,可以将listen返回的结果分配给变量,并在完成后取消订阅(例如dispose()方法)。我应该如何取消await-for循环侦听的流?

为了澄清,我不希望更改执行流程(例如,取消Stream以便运行await-for之后的代码),但是是为了防止在我不需要时发生内存泄漏流了。

2 个答案:

答案 0 :(得分:1)

取消await for创建的订阅的唯一方法是退出循环。

使用returnbreakcontinuethrowrethrow(或{{1 }}操作中的yield函数,其中流上的侦听器已取消),基础订阅上的async*方法将自动取消。

如果循环终止,那是因为流已经完成,所以不必担心。

如果您想长时间在循环内进行计算,然后退出循环,那么我建议您重组代码以在循环外进行计算。那就是:

cancel

将使流保持活动状态并暂停,直到await for (var event in stream) { if (event.isTheOne) { await longComputation(event); break; } } 完成。 相反,我会做类似的事情:

longComputation

或类似的东西。

答案 1 :(得分:0)

我认为How should I go about canceling a Stream有点拼写错误。对于listen方法,您已正确编写了cancel the Subscription,因为您取消了订阅,而不是自己取消订阅。

listen()是非阻塞的,它创建一个预订,注册一个回调,然后继续执行当前代码块中的下一个代码。 await for构造为 blocking ,它不会为该流创建订阅。在关闭流之前,代码的执行不会超出await for范围。用示例here描述。因此,据我了解,在使用await for的情况下,您不必担心内存泄漏。