我已经做了一些阅读,并且认为我已经掌握了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关键字,不是吗?
上述有什么不同吗?哪个“更好”?
答案 0 :(得分:17)
await
用于在等待完成时继续执行方法体。如果没有什么可以继续,那么你就不需要等待了。
您可以考虑等待(简化)ContinueWith
操作。所以,你的第一种方法是:
foreach (var something in someCollection)
DoSomething();
DoSomethingElse();
DoMethodAsync().ContinueWith(t => {});
有一篇很好的MSDN文章描述了what happens in async method,它有很好的代码流程图: