Dart-async与await的疑惑(已解决)

概述

async与await是基于事件循环的异步模型,并不是并行执行,因此耗时的操作依然会导致阻塞。

下面的两个示例,是我比较疑惑的地方,与预期的结果不同。

现在已经搞清楚啦,但还是保留此文。

async与await示例(1)

先来看以下测试代码。

void TestDart() async{
    TestAwait1();
    print("TestAwait1 running");
  }

void TestAwait1() async{
    print("TestAwait1 begin");
    await sleep(const Duration(seconds: 2));
    print("TestAwait1 A");
  }

输出结果:

I/flutter ( 4720): TestAwait1 begin
(2秒后)

I/flutter ( 4720): TestAwait1 running

I/flutter ( 4720): TestAwait1 A

修改一下代码,第二行增加await

 void TestDart() async{
    await TestAwait1();
    print("TestAwait1 running");
  }

void TestAwait1() async{
    print("TestAwait1 begin");
    await sleep(const Duration(seconds: 2));
    print("TestAwait1 A");
  }

输出结果

I/flutter ( 4720): TestAwait1 begin
(2秒后)

I/flutter ( 4720): TestAwait1 A

I/flutter ( 4720): TestAwait1 running

能够发现输出结果的后两条顺序相反。

async与await示例(2)

先来看以下测试代码。

void TestDart() async{
      CreateTestAwait2();
      print("create running");
  }

  void CreateTestAwait2(){
    TestAwait2();
    print("CreateTestAwait2 running");
  }

  TestAwait2() async{
    await sleep(const Duration(seconds: 2));
    print("TestAwait2 running");
  }

输出结果

(等待2秒)

I/flutter ( 4720): CreateTestAwait2 running

I/flutter ( 4720): create running

I/flutter ( 4720): TestAwait2 running

修改一下代码,增加await "";

 void TestDart() async{
      CreateTestAwait2();
      print("create running");
  }

  void CreateTestAwait2(){
    TestAwait2();
    print("CreateTestAwait2 running");
  }

  TestAwait2() async{
    await "";
    await sleep(const Duration(seconds: 2));
    print("TestAwait2 running");
  }

输出结果

I/flutter ( 4720): CreateTestAwait2 running

I/flutter ( 4720): create running

(等待2秒)

I/flutter ( 4720): TestAwait2 running

能够发现等待2秒的时间点不一样。

 

留下评论