19

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

但是,我不确定我是否正确解决了一个小问题,并且正在寻找验证或有人纠正我。

我正在使用这个签名实现一个异步方法:

public Task ProcessUploadedFile(FileInfo info, string contentType);

显然,如果我想在方法中等待任何东西,我需要将 async 关键字添加到签名中,

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

例如。

1:

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

  DoSomethingElse();

  await DoMethodAsync();
}

2:

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

      DoSomethingElse();

      return DoMethodAsync();
    }

我最初写的是前者,但不再看到添加等待的意义。如果我写后者,我会完成同样的事情,如果他们选择,这两种方法的调用者仍然可以使用 await 关键字,不是吗?

以上有什么不同吗?哪个更好”?

4

1 回答 1

18

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

您可以将 await (简化)视为ContinueWith操作。所以,你的第一种方法是这样的:

foreach (var something in someCollection)
     DoSomething();

DoSomethingElse();

DoMethodAsync().ContinueWith(t => {});

有一篇很好的 MSDN 文章描述了异步方法中发生的事情,它有很好的代码流程图:

在此处输入图像描述

于 2013-08-05T15:26:20.797 回答