【问题标题】:Working of await in Async await异步等待中的等待工作
【发布时间】:2014-06-06 08:57:22
【问题描述】:

考虑一个异步 (*Async / async) 函数,该函数被调用两次,一次使用 await,另一次不使用。

如果我使用await,会不会等到异步函数执行完毕再执行下一行?

await db.SaveChangesAsync();
//Some code here

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

db.SaveChangesAsync();
//Some code here

我就在这里,还是在 async 函数中必须等待?

【问题讨论】:

标签: c# .net entity-framework c#-4.0 async-await


【解决方案1】:

如果我使用await,会不会等到async函数执行完毕再执行下一行。

这取决于方法返回。它返回一个Task[<T>],它代表一个未来值。如果Task 已经完成,它会保持同步运行。否则,当前方法的剩余部分将作为延续添加 - 当异步部分报告完成时调用的委托回调。

在这两种情况下,它所做的是在异步部分继续进行时阻塞调用线程。

而且,如果我不使用 await,它是否会继续执行它下面的代码而不等待 async 函数完成。

是的

...对于async 函数,还是必须强制等待?

什么时候调用它们?不是强制性的,但它确实使事情变得方便。通常,此类函数返回Task[<T>],也可以通过不同的代码使用。您可以使用.ContinueWith(...).Wait.Result 等。或者您可以完全忽略Task。最后一个是个坏主意,因为异步函数上的异常需要到某个地方:如果没有观察到异常,就会发生非常糟糕的事情。

编写它们时:如果你编写了一个async 方法并且其中没有await 关键字,编译器将显示一个警告,表明你可能正在做有事吗。同样,不是严格强制,但强烈推荐。

【讨论】:

  • 不错的答案。非常感谢。解开了很多疑惑。为你+1 :)
  • 关于“如果没有观察到异常会发生非常糟糕的事情”。这给人的印象是,当忽略 Task 时,某些事情会积极发生;实际上在这种情况下异常被吞没了(除非你使用async void)。也就是说,我同意发生的非常糟糕的事情是您吞下了一个异常,并可能使您的程序处于不一致的状态或忽略了一个错误。
猜你喜欢
  • 2016-07-07
  • 2016-03-25
  • 2017-10-09
  • 1970-01-01
  • 2019-01-13
  • 1970-01-01
  • 2021-10-22
相关资源
最近更新 更多