Async await 中 await 的工作原理

4
考虑一个异步 (*Async / async) 函数会被调用两次,一次使用 await,另一次不使用。
如果我使用 await,它会等待异步函数执行完成后再执行下一行吗?
await db.SaveChangesAsync();
//Some code here

如果我不使用await,它会继续执行下面的代码而不等待异步函数完成吗?

db.SaveChangesAsync();
//Some code here

当使用 async 函数时,await 是必须的,我理解得对吗?


1
我已经编辑了你的标题。请参考“问题的标题应该包含“标签”吗?”,在那里达成共识是“不应该”。 - John Saunders
1个回答

9
如果我使用await,它会等到异步函数执行完毕后再执行下一行。这取决于方法返回的对象。它返回一个代表未来值的Task[T]。如果该任务已完成,它将以同步方式运行。否则,当前方法的剩余部分将作为一个继续项添加——一个委托回调,在异步部分报告完成时调用它。
无论哪种情况,它都不会阻塞调用线程,而异步部分继续。
如果我不使用await,它会在不等待异步函数完成的情况下继续执行其下面的代码。
是的
…或者在async函数中使用await是强制性的吗?
当调用它们时?不是强制性的,但这确实使事情变得方便。通常,这些函数返回一个Task[T],也可以通过不同的代码消耗它们。您可以使用.ContinueWith(...)、.Wait、.Result等等。或者你可以完全忽略Task。后者是一个坏主意,因为异步函数的异常需要去“某个地方”:如果不观察异常,会发生非常糟糕的事情。
然而,在编写它们时:如果您编写了一个async方法,并且在其中没有await关键字,编译器将呈现一个警告,指示您可能正在做错事情。再次强调,这不是绝对必需的,但强烈推荐。

好答案。非常感谢。解决了很多疑惑。+1 给你,伙计 :) - Pratik Bhoir
关于“如果不遵守异常会发生非常糟糕的事情”的说法。这给人一种印象,即在忽略Task时会发生某些积极的事情;而实际上,在这种情况下异常被吞噬了(除非使用async void)。话虽如此,我同意发生的非常糟糕的事情是您吞噬了一个异常,可能使程序处于不一致的状态或忽略了一个错误。 - Matt Smith

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