mirror of
https://github.com/dart-lang/sdk
synced 2024-09-18 22:01:19 +00:00
310385aeb2
An async* stream may only be canceled at yield-points. R=hausner@google.com Review URL: https://codereview.chromium.org/1677063003 .
60 lines
1.6 KiB
Dart
60 lines
1.6 KiB
Dart
// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
|
|
// for details. All rights reserved. Use of this source code is governed by a
|
|
// BSD-style license that can be found in the LICENSE file.
|
|
|
|
import "dart:async";
|
|
import "package:expect/expect.dart";
|
|
import "package:async_helper/async_helper.dart";
|
|
|
|
var events = [];
|
|
|
|
var timer;
|
|
ticker(period) async* {
|
|
var sc;
|
|
sc = new StreamController(onListen: () {
|
|
events.add("listen");
|
|
timer = new Timer.periodic(period, (_) {
|
|
sc.add(null);
|
|
});
|
|
}, onCancel: () {
|
|
events.add("cancel");
|
|
timer.cancel();
|
|
});
|
|
|
|
try {
|
|
var counter = 0;
|
|
await for (var tick in sc.stream) {
|
|
counter++;
|
|
}
|
|
} finally {
|
|
events.add("finally");
|
|
}
|
|
}
|
|
|
|
void main() {
|
|
asyncStart();
|
|
events.add("main");
|
|
final subscription =
|
|
ticker(const Duration(milliseconds: 20)).listen((val) { });
|
|
|
|
bool cancelFinished = false;
|
|
new Timer(const Duration(milliseconds: 100), () async {
|
|
// Despite the cancel call below, the stream doesn't stop.
|
|
// The async* function is not blocked at any await (since the inner timer
|
|
// continuously ticks), but since there/ is no yield-point in the function
|
|
// it won't cancel.
|
|
new Timer(const Duration(milliseconds: 30), () {
|
|
Expect.isFalse(cancelFinished);
|
|
Expect.listEquals(["main", "listen", "invoke cancel"], events);
|
|
timer.cancel();
|
|
asyncEnd();
|
|
});
|
|
|
|
events.add("invoke cancel");
|
|
await subscription.cancel();
|
|
// This line should never be reached, since the cancel-future doesn't
|
|
// complete.
|
|
cancelFinished = true;
|
|
});
|
|
}
|