-
Notifications
You must be signed in to change notification settings - Fork 232
Open
Description
I have this example from @lrhn that could be used to update long_running_isolate.dart
In Lasse's words: This is a fairly primitive version of remote-running a stream function, it doesn't forward pause/resume/cancel calls on the subscription, and it stops on the first error. It does show how to send multiple events back from the other isolate.
import "dart:isolate";
Stream<T> runStream<T>(Stream<T> Function() remoteStream) =>
Stream.multi((controller) async {
// New port for event messages.
var port = RawReceivePort();
port.handler = (message) {
var list = message as List;
if (list.length == 1) {
controller.add(list[0] as T);
} else {
controller.addError(list[1] as Object, list[2] as StackTrace);
}
};
// Run in other isolate, receive stream events on `port`.
try {
await Isolate.run(_remoteStream(remoteStream, port.sendPort));
// Returns when stream done.
} catch (e, s) {
controller.addError(e, s);
} finally {
port.close();
controller.close();
}
});
// Creates an argument to `Isolate.run` from a `Stream Function()` and a port.
Future<void> Function() _remoteStream(
Stream Function() createStream, SendPort port) {
Future<void> runStreamSendEvents() async {
try {
await for (var event in createStream()) {
// Send events on port.
port.send([event]);
}
} catch (e, s) {
// Send events on port.
port.send([e, s]);
}
}
return runStreamSendEvents;
}
// Example use:
void main() async {
await for (var v in runStream(() => someInts(5))) {
print(v);
}
}
Stream<int> someInts(int n) async* {
for (var i = 0; i < n; i++) {
yield i;
}
}There's value in keeping the sample as-is, using primitives, rather than replacing it. Using primitives without run is still a use case, even if this particular solution can be modified with run, it's still good to maintain a large example of primitive usage. So maybe another sample can be created, that just shows the same solution written with run.
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels