【发布时间】:2014-02-21 23:20:13
【问题描述】:
我修改了教程https://www.dartlang.org/docs/tutorials/streams/中的小例子,在订阅后添加了项目:
import 'dart:async';
main() {
var data = new List<int>();
var stream = new Stream.fromIterable(data); // create the stream
// subscribe to the streams events
stream.listen((value) { //
print("Received: $value"); // onData handler
}); //
data.add(1);
}
运行这个程序后,我得到了:
Uncaught Error: Concurrent modification during iteration: _GrowableList len:1.
Stack Trace:
#0 ListIterator.moveNext (dart:_collection-dev/iterable.dart:315)
#1 _IterablePendingEvents.handleNext (dart:async/stream_impl.dart:532)
#2 _PendingEvents.schedule.<anonymous closure> (dart:async/stream_impl.dart:661)
#3 _asyncRunCallback (dart:async/schedule_microtask.dart:18)
#4 _createTimer.<anonymous closure> (dart:async-patch/timer_patch.dart:11)
#5 _Timer._createTimerHandler._handleTimeout (timer_impl.dart:151)
#6 _Timer._createTimerHandler.<anonymous closure> (timer_impl.dart:166)
#7 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:93)
在添加侦听器之前输入data.add(1) 可以正常工作。
我检查了documentation about Stream 并没有发现我做错了什么。我原以为听众会在最好的情况下被解雇,而在最坏的情况下不会被解雇,但也不例外。
这是预期的行为吗?如果是,请描述原因。
【问题讨论】:
-
能否在添加前锁定“数据”对象,添加后释放?
-
锁是什么意思?据我所知,Dart 执行是单线程的,不需要进行任何线程同步。你能指点关于锁定/解锁的手册吗?
-
对不起。是的,你不能:$。但是计时器事件将异步运行,并且 .add 在 listen() 调用之后立即运行。因此它们将同时运行(即在异步调用使用迭代器时更改数组)。
标签: dart dart-async