没有使用async/await的嵌套Task<T>调用

3

这与以下帖子有关:为什么要一直使用异步/等待

我很想知道在下面的情况下会发生什么:

由于评论而更新:

async Task FooAsync()
{
    await Func1();
    // do other stuff
}

Task Func1()
{
    return Func2();
}

async Task Func2()
{
    await tcpClient.SendAsync();
    // do other stuff
}

这整个过程是否会成为阻塞调用?或者因为Func1()实际上是等待的,UI可以去做其他事情?最终是否有必要在Func1()上添加async/await?我已经尝试了一下,但实际上并没有注意到任何区别,因此提出了这个问题。任何见解都将很好,谢谢!


Func1()中缺少返回语句,无法编译。 - Guillaume
2个回答

3

Asyncawait只是编译器功能。

如果没有使用await,调用异步方法将导致它以同步(阻塞)方式执行。

当您使用await时,所有在await下方的代码都会被编译器自动包装在Task.ContinueWith()方法中,这意味着在任务完成后,下面的代码才会被执行。

public async Task<int> method2(){
  return Task.FromResult(1);
}

public void method1(){
  await method2()
  Console.WriteLine("Done");
}

will translate something like :

  public Task<int> method2(){
      return Task.FromResult(1);
    }

    public void method1(){
      method2().ContinueWith(x => {
        Console.WriteLine("Done");
      });
    }

注意:这并不像只是一个ContinueWith那么简单,这里有我的一篇旧回答,如果你想要看更详细的解释,我在那里解释了相同的概念。 - Scott Chamberlain
而且,如果您不使用async-await,它就不会阻塞。 - Paulo Morgado

0

不将Func1async方法制作并且不在其中awaitFunc2的唯一问题是任何抛出的异常都不会显示Func1

底线是await适用于可等待对象,而Task/Task<T>可等待对象


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接