“异步任务然后等待任务”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的版本将外部编译器生成的任务中的内部任务的执行包装起来。 非异步版本没有。 因此,非异步版本(非常简单地)更有效。