“async Task然后等待任务”vs“任务然后返回任务”

时间:2016-06-24 15:30:53

标签: c# multithreading asynchronous

快速提问..

为了对异步编程和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
    // ..
}

2 个答案:

答案 0 :(得分:35)

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

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

由于await之后没有其他代码,因此无需使用await。只需返回Task即可。

答案 1 :(得分:6)

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