我对Dart流有一个疑问,如下所示。当我通过其listen()
方法使用Stream时,可以将listen
返回的结果分配给变量,并在完成后取消订阅(例如dispose()
方法)。我应该如何取消await-for
循环侦听的流?
为了澄清,我不希望更改执行流程(例如,取消Stream以便运行await-for
之后的代码),但是是为了防止在我不需要时发生内存泄漏流了。
答案 0 :(得分:1)
取消await for
创建的订阅的唯一方法是退出循环。
使用return
,break
,continue
,throw
或rethrow
(或{{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
的情况下,您不必担心内存泄漏。