"async Task然后等待任务"vs"任务然后返回任务"

Kha*_*laf 44 c# multithreading asynchronous

快问...

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

这个:

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

对此:

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

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

private async void closeButtonTask()
{
    // Some Task 1
    // ..

    await CloseApp();

    // Some Task 2
    // ..
}
Run Code Online (Sandbox Code Playgroud)

Ren*_*ogt 43

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

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

由于您之后没有更多代码await,因此无需使用await.简单回归Task就够了.

  • *“当你点击等待时,控制流返回到调用方法”* - 控制流**可能**返回到调用方法,特别是当等待的任务已经完成时它不会返回。 (2认同)

Fal*_*nwe 8

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

  • 好的,我只想指出并非每个人都如此([1](https://msdn.microsoft.com/zh-cn/magazine/hh456402.aspx)),您不能依靠任务或对该任务的引用是短暂的([2](https://channel9.msdn.com/Events/Build/BUILD2011/TOOL-829T),[在0:25:40](https:// channel9。 msdn.com/Events/Build/BUILD2011/TOOL-829T#time=25m40s),[在0:30:20](https://channel9.msdn.com/Events/Build/BUILD2011/TOOL-829T#time= 30分20秒))。 (2认同)