我使用这个程序来了解Dart的异步编程。
import 'dart:io';
Future<int> sumStream(Stream<int> stream) async {
var sum = 0;
await for (final value in stream) {
print('consuming event $value');
sum += value;
}
return sum;
}
Stream<int> countStream(int to) async* {
for (int i = 1; i <= to; i++) {
sleep(const Duration(milliseconds: 400));
print('publishing event $i');
yield i;
}
}
Future<void> main() async {
var stream = countStream(10);
var sum = sumStream(stream);
print('working...');
sleep(const Duration(milliseconds: 500));
print('working...');
sleep(const Duration(milliseconds: 500));
print('working...');
sleep(const Duration(milliseconds: 500));
print(await sum); // 55
}输出:
working...
working...
working...
publishing event 1
consuming event 1
publishing event 2
consuming event 2
publishing event 3
consuming event 3
publishing event 4
consuming event 4
publishing event 5
consuming event 5
publishing event 6
consuming event 6
publishing event 7
consuming event 7
publishing event 8
consuming event 8
publishing event 9
consuming event 9
publishing event 10
consuming event 10
55在上面的代码中,我选择不立即使用await来获取sumStream()的结果,因为在sumStream()忙于从提供的流中消费事件时,我想做一些额外的工作。因此,我的期望是,sumStream()将在main()运行时立即开始运行。我希望输出结果类似于下面的文本。我希望文本working...与发行者countStream()和使用者sumStream()的其他打印信息交织在一起。
working...
publishing event 1
consuming event 1
publishing event 2
consuming event 2
publishing event 3
consuming event 3
working...
publishing event 4
consuming event 4
publishing event 5
consuming event 5
publishing event 6
working...
consuming event 6
publishing event 7
consuming event 7
publishing event 8
consuming event 8
publishing event 9
consuming event 9
publishing event 10
consuming event 10
55这是因为Dart是单线程的,因此不能同时运行main()、countStream()和sumStream()吗?如果是这样的话,我如何更改我的程序,使sumStream()能够与main()并行运行(使其成为多线程)?
发布于 2021-12-04 00:16:03
我很确定这是由于sleep函数。睡眠功能文档
小心使用这一点,因为在睡眠调用中阻止异步操作时,不可以在隔离中处理异步操作。
我建议试一试:
await Future.delayed(const Duration(milliseconds: 500));它不会阻止正在进行的其他异步操作的处理。
https://stackoverflow.com/questions/70221608
复制相似问题