3

我正在尝试实现一个连接运算符,该运算符采用 Streams 列表并输出单个流。问题是输出顺序与输入顺序不同。StreamController.add 是异步的,所以如果我这样做

sc1.add(1)
sc2.add(2)
sc2.add(3)
sc2.add(4)
sc1.add(5)
...

调用各个流 ondata 回调的顺序类似于 1、2、5、3、4,这基本上是 sc1 和 sc2 的交错。这种顺序在执行过程中非常一致,这让我相信该实现是在单个线程上进行循环调度。(这是在飞镖虚拟机上)

如果在我的连接实现中调用 ondata 回调时排序已经被打乱,我无法正确实现这个连接。有没有人对如何实现这一点有好的想法?

4

2 回答 2

3

我相信您正在使用一些最新版本的 SDK。

syncSteamController自 v0.5.11 起为构造函数引入了标志,它控制此行为(请参阅此处此处的文档)。默认情况下,它设置为false,这意味着侦听器被异步调用,即在add调用完成后的某个时间:

如果 sync 为 false,则无法保证多个侦听器何时获取事件,但每个侦听器将以正确的顺序获取所有事件。如果在具有两个侦听器的异步控制器上发送两个事件,则其中一个侦听器可能会在另一个侦听器获得任何事件之前获得这两个事件

如果您不拥有控制器,那么我不确定您是否可以做很多事情。

于 2013-06-10T07:48:24.367 回答
0

addsync仅当使用命名参数和值创建 StreamController 时才同步true

http://api.dartlang.org/docs/releases/latest/dart_async/StreamController.html#StreamController

于 2013-06-10T07:50:20.360 回答