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

时间:2013-08-05 15:23:32

标签: .net task-parallel-library async-await

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

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

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

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关键字,不是吗?

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

1 个答案:

答案 0 :(得分:17)

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

您可以考虑等待(简化)ContinueWith操作。所以,你的第一种方法是:

foreach (var something in someCollection)
     DoSomething();

DoSomethingElse();

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

有一篇很好的MSDN文章描述了what happens in async method,它有很好的代码流程图:

enter image description here