美文网首页
flutter-异步编程

flutter-异步编程

作者: 小源子2016 | 来源:发表于2021-04-05 01:08 被阅读0次

Dart执行(运行在UI task runner ,root isolate)

image.png
  • 优先执行Miscrotask队列
library flutter_package3;

import 'dart:async';
void isolateTest() async{
  print('isolateTest #1 of 2');
  scheduleMicrotask(() => print('microtask #1 of 3'));
  //使用delay方式,是将此task放到queue的尾部,
  //若前面有耗时操作,不一定能准时执行
  await new Future.delayed(new Duration(seconds:1),
          () => print('future #1 (delayed)'));

  //使用then,是表示在此task执行后立刻执行
  new Future(() => print('future #2 of 4'))
      .then((_) => print('future #2a'))
      .then((_) {
    print('future #2b');
// 其他几步应该可以理解为同一个任务,这里新开个微任务,主任务执行后立即执行这个微任务
    scheduleMicrotask(() => print('microtask #0 (from future #2b)'));
  })
      .then((_) => print('future #2c'));

  scheduleMicrotask(() => print('microtask #2 of 3'));

  new Future(() => print('future #3 of 4'))
      .then((_) => new Future(
           //注意这种写法阻塞下一个then函数
          () => print('future #3a (a new future)')))
      .then((_) => print('future #3b'));

  new Future(() => print('future #4 of 4'))
      .then((_) {
      // 注意:这种写法不阻塞一一个then函数
     //若加个return 就变成阻塞了
     new Future(() => print('future #4a'));
  })
      .then((_) => print('future #4b'));
  scheduleMicrotask(() => print('microtask #3 of 3'));
  print('isolateTest #2 of 2');
}

//在main中调用
void main() {
  isolateTest();
  print('main');
}

  • 同步代码应该优先执行,异步代码优先执行微队列
  • await含义进一步理解,执行到await语句时将async方法内的所有剩余代码都放到event loops队列尾部

CUP耗时和IO耗时

void _incrementCounter() async {
  var future = await new Future(() {
    var i = 0;
    while (true) {
      print("${i++}");
      if (i > 200000) {
        break;
      }
    }
    return new Dio().get('http://www.baidu.com');
  });
  setState(() {
    _counter = future.hashCode;
  });
}

在future里面做一个20万次打印的操作,这个时候我们再次点击floatingActionButton,然后点击IconButton,UI就会卡顿。
这里就要分IO耗时和CPU耗时了,网络请求和文件读取一类的操作不会使用CPU,而是纯等待IO而已,所以我们CPU可以去event Queue里取其他Task执行,而CPU耗时就是实实在在的CPU计算了。由于Dart是单线程的,Futrue的异步并不是真正的异步,所以会造成卡顿。

Dart是单线程,没有真正的异步,需要避免CPU耗时,IO耗时没关系的
https://www.jianshu.com/p/3f99e4d302c3

相关文章

  • flutter-异步编程

    首先看一张Flutter体系结构图: 我们只关注线程相关信息 1、Framework:我们直接接触的层级 2、en...

  • flutter-异步编程

    Dart执行(运行在UI task runner ,root isolate) 优先执行Miscrotask队列 ...

  • Flutter- Streams的异步编程

    部分代码的单独工作流程 异步编程是一种原则,允许您的程序的一部分在等待应用程序线程中发生的其他活动时运行。它允许您...

  • ES6学习--异步编程--Generator

    异步编程 : (异步编程的语法目的就是让异步编程更像同步编程) 回调函数利用回调函数实现异步编程本身没有问题, 问...

  • JavaScript异步编程好文摘要

    JavaScript之异步编程简述JavaScript异步编程

  • 认识异步编程

    认识异步编程 本章主要介绍异步编程的概念和作用,Java中异步编程的场景以及不同异步编程场景应使用什么技术实现。 ...

  • part1整理

    函数式编程:JavaScript函数式编程指南 异步编程:异步编程 Promise源码 JavaScript基础知...

  • flutter-异步支持

    Future用来异步操作。1.延时发送Future.then() 2.异常捕获Future.catchError ...

  • 论异步编程

    相信本书介绍了CompletableFuture,大家就会认识到什么是异步编程。异步编程的好处。 异步编程最大好处...

  • 读书笔记#Java异步编程实战-上

    Java异步编程实战 chap1 认识异步编程 异步编程概念与作用在使用同步编程方式时,由于每个线程同时只能发起一...

网友评论

      本文标题:flutter-异步编程

      本文链接:https://www.haomeiwen.com/subject/qpvrkltx.html