等待在Async中等待

Pra*_*oir 3 .net c# entity-framework async-await c#-4.0

考虑一个异步(*Async/ async)函数,它被调用两次,一次调用,await没有它.

如果我使用await,它会等到执行异步函数然后执行下一行吗?

await db.SaveChangesAsync();
//Some code here
Run Code Online (Sandbox Code Playgroud)

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

db.SaveChangesAsync();
//Some code here
Run Code Online (Sandbox Code Playgroud)

是的,我在这里或等待是功能强制性的async吗?

Mar*_*ell 8

如果我使用await,它会等到async函数执行后再执行下一行.

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

在任何一种情况下,它都没有做的是在异步部分继续时阻塞调用线程.

并且,如果我不使用await,它将继续执行它下面的代码而无需等待async函数完成.

...或等待功能时必须要么async

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

但是,在编写它们时:如果你编写一个async方法并且await那里没有关键字,编译器会发出一个警告,表明你可能做错了.同样,不是严格强制性的,但强烈推荐.