3

ストリームのリストを取得して単一のストリームを出力する結合演算子を実装しようとしています。問題は、出力順序が入力順序と同じではないことです。StreamController.add は非同期なので、そうすると

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

それぞれのストリーム ondata コールバックが呼び出される順序は、基本的に sc1 と sc2 のインターリーブである 1、2、5、3、4 のようなものです。この順序は実行全体でかなり一貫しているため、実装が単一のスレッドでラウンド ロビン ディスパッチを行っていると思われます。(これは dart VM 上にあります)

結合の実装で ondata コールバックが呼び出されるまでに順序がすでに混乱している場合、この結合を正しく実装できません。誰もこれを実装する方法について良いアイデアを持っていますか?

4

2 に答える 2

3

SDK の最近のバージョンを使用していると思います。

syncフラグはSteamControllerv0.5.11 以降のコンストラクターに導入され、この動作を制御します (こちらこちらのドキュメントを参照してください)。デフォルトでは に設定されています。これは、リスナーが非同期的に呼び出されることを意味します。つまり、呼び出しが終了してfalseからしばらくしてから呼び出されます。add

sync が false の場合、各リスナーが正しい順序ですべてのイベントを取得することを除いて、複数のリスナーがいつイベントを取得するかに関して保証はありません。2 つのリスナーを持つ非同期コントローラーで 2 つのイベントが送信された場合、リスナーの 1 つが両方のイベントを取得してから、もう一方のリスナーがイベントを取得する可能性があります。

コントローラーを所有していない場合、できることがたくさんあるかどうかはわかりません。

于 2013-06-10T07:48:24.367 に答える
0

addsyncStreamController が名前付きパラメーターと値で作成されている場合にのみ同期しますtrue

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

于 2013-06-10T07:50:20.360 に答える