快速提问..
为了对异步编程和await
有一个基本的了解,我想知道这两个代码片段在多线程和执行顺序和时间方面有什么区别:
:此:
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
// ..
}
答案 0 :(得分:35)
几乎相同(就线程等而言)。但是对于第二个(使用await
),编译器将创建更多的开销。
编译器将声明为async
并使用await
的方法转换为状态机。因此,当您点击await
时,控制流将返回到调用方法,并在等待async
完成后await
之后恢复Task
方法的执行。
由于await
之后没有其他代码,因此无需使用await
。只需返回Task
即可。
答案 1 :(得分:6)
这两种方法之间的差异很小。基本上,它们具有相同的语义。但是,具有async / await的版本将外部编译器生成的任务中的内部任务的执行包装起来。非异步版本没有。因此,非异步版本(非常简单)更有效。