首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我的Dart异步函数不能立即开始工作?

为什么我的Dart异步函数不能立即开始工作?
EN

Stack Overflow用户
提问于 2021-12-03 23:04:17
回答 1查看 55关注 0票数 0

我使用这个程序来了解Dart的异步编程。

代码语言:javascript
复制
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
}

输出:

代码语言:javascript
复制
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()的其他打印信息交织在一起。

代码语言:javascript
复制
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()并行运行(使其成为多线程)?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-04 00:16:03

我很确定这是由于sleep函数。睡眠功能文档

小心使用这一点,因为在睡眠调用中阻止异步操作时,不可以在隔离中处理异步操作。

我建议试一试:

代码语言:javascript
复制
await Future.delayed(const Duration(milliseconds: 500));

它不会阻止正在进行的其他异步操作的处理。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70221608

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档