【问题标题】:How to cleanup streams in a dartvm application?如何清理 dartvm 应用程序中的流?
【发布时间】:2022-06-14 06:55:14
【问题描述】:

请注意,我问的是一个严格的 dart only 应用程序,它以任何方式涉及颤振,dartvm 指的是 dart 虚拟机。

据我了解,Dart 的反应状态概念是通过流实现的,处理流对象的生命周期的责任交给了程序员,在运行时,人们可以根据适用的方式来操作他们认为合适的流通过添加到流中来设计他们的设计;听它或处理它。

我的问题是,在我的应用程序退出之前,我是否需要调用流的dispose() 方法?如果我这样做了,我该如何实现呢?挂钩到 VM 状态没有得到很好的记录,并且使用 ProcessSignal 侦听器是不可移植的,如果我不这样做,GC 会处理这种情况吗?在这种情况下,最佳做法是什么?

【问题讨论】:

  • 如何退出程序?
  • @julemand101 我目前知道两种方式,一种是ctrl + c,另一种是正常的执行流程。
  • 好吧,我不认为你应该关心垃圾收集,因为你的程序只是被关闭了(如果你刚刚使用 Dart 代码分配,你的操作系统将删除 Dart 进程使用的所有内存)记忆)。但是我认为如果您想确保在程序停止之前处理所有事件,您应该更加关注。但是,如果这不重要,那么只要程序停止,这并不重要。有关使 Dart 程序“自然”停止的原因,请参见我的回答:stackoverflow.com/a/70670962/1953515

标签: dart asynchronous dispose dart-stream


【解决方案1】:

Dart 流没有dispose 方法。因此你不需要调用它。

但只是为了提供更多细节...... Dart 流是很多东西。或者更确切地说,流非常简单,它们只是在提供事件的代码和使用事件的代码之间提供连接的一种方式。调用listen 后,流对象不再是通信的一部分,事件和推送直接在事件源(可能是StreamController)和消费者(StreamSubscription)之间进行。

事件提供者有很多东西。

某些事件仅由代码执行操作触发。之后不需要清理,它只是 Dart 对象和其他所有东西一样,它们会随着程序而死,如果没有实时代码引用它们,它们可以更早地被垃圾收集。

某些事件是由底层操作系统上的 I/O 操作触发的。这些通常会在程序结束时被清理掉,因为它们是通过 Dart 运行时系统分配的,并且它知道如何再次停止它们。 一旦您不再需要任何活动,取消订阅仍然是一个好主意。这样,您就不会让文件打开太久,也不会阻止程序的另一部分覆盖它。

某些代码可能会分配其他资源,而不是由运行时管理,您应该特别注意何时不再需要该资源。 您必须通过阅读流的文档,逐案弄清楚这一点。

通常,如果您不再需要流中的任何事件,则应始终取消订阅。这是你能做的一件事。如果不出意外,它允许垃圾收集器更早地收集东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多