“异步任务然后等待任务”vs“任务然后返回任务”

快问…

为了对异步编程和await做一些基础的理解,我想知道这两个代码片段在multithreading和执行顺序和时间方面有什么区别:

这个

 public Task CloseApp() { return Task.Run( ()=>{ // save database // turn off some lights // shutdown application }); } 

对此:

 public async Task CloseApp() { await Task.Run( ()=>{ // save database // turn off some lights // shutdown application }); } 

如果我在这个例程中调用它:

 private async void closeButtonTask() { // Some Task 1 // .. await CloseApp(); // Some Task 2 // .. } 

它几乎相同(就线程等而言)。 但是对于第二个(使用await ),编译器将创建更多的开销。

声明为async和使用await方法由编译器转换为状态机 。 因此,当您点击await ,控制流将返回到调用方法,并且await等待Task完成后await执行async方法。

因为await之后没有更多的代码,所以无论如何都不需要使用await 。 简单地返回Task就足够了。

这两种方法之间的差异很小。 基本上,它们具有相同的语义。 但是,具有async / await的版本将外部编译器生成的任务中的内部任务的执行包装起来。 非异步版本没有。 因此,非异步版本(非常简单地)更有效。