等待任务:返回任务或等待等待后没有代码

dar*_*ect 19 .net task-parallel-library async-await

我已经做了一些阅读,并且认为我已经掌握了await和async关键字的基础知识,关于System.Threading.Task.

但是,我不确定我是否对一个小问题是正确的,我正在寻找验证或有人纠正我.

我正在使用此签名实现异步方法:

public Task ProcessUploadedFile(FileInfo info, string contentType);
Run Code Online (Sandbox Code Playgroud)

显然,如果我想等待方法内的任何内容,我需要在签名中添加async关键字,

我的问题是这样的:如果我的方法做的最后一件事是调用另一个异步方法,或者返回一个任务,那么等待它有什么意义吗?

例如.

1:

public async Task ProcessUploadedFile(FileInfo info, string contentType)
{
  foreach (var something in someCollection)
    DoSomething();

  DoSomethingElse();

  await DoMethodAsync();
}
Run Code Online (Sandbox Code Playgroud)

2:

public Task ProcessUploadedFile(FileInfo info, string contentType)
    {
      foreach (var something in someCollection)
        DoSomething();

      DoSomethingElse();

      return DoMethodAsync();
    }
Run Code Online (Sandbox Code Playgroud)

我最初写的是前者,但是不能再看到添加等待的重点了.如果我要编写后者,我会完成同样的事情,两个方法的调用者仍然可以使用await关键字,如果他们选择,不是吗?

上面有什么不同吗?哪个更好"?

Ser*_*kiy 17

await用于在等待完成时继续执行方法体.如果没有什么可以继续,那么你不需要等待.

你可以想到等待(简化)ContinueWith操作.所以,你的第一种方法是这样的:

foreach (var something in someCollection)
     DoSomething();

DoSomethingElse();

DoMethodAsync().ContinueWith(t => {});
Run Code Online (Sandbox Code Playgroud)

有一篇很好的MSDN文章描述了async方法发生了什么,它有很好的代码流图:

在此输入图像描述

  • 即使您之后不需要执行任何操作,也应等待从异步方法中捕获异常. (2认同)
  • @Adi即使我返回Task(而不是await),我的方法的调用者仍然可以等待返回的Task来捕获异常,对吧?那么在这种情况下,它不会有任何区别,不是吗? (2认同)