# 异步任务(async, await, Task) 下面的代码是同步执行的: ```csharp // 同步 Console.WriteLine("调用 DoSomethingSync 之前"); DoSomethingSync(); Console.WriteLine("调用 DoSomethingSync 之后"); void DoSomethingSync(){ Thread.Sleep(1000); Console.WriteLine("等我一秒钟"); } ``` 输出的结果是: ```csharp 调用 DoSomethingSync 之前 等我一秒钟 调用 DoSomethingSync 之后 ``` 而下面的代码是异步执行的: ```csharp // 异步 Console.WriteLine("调用 DoSomethingAsync 之前"); Task task = DoSomethingAsync(); Console.WriteLine("调用 DoSomethingAsync 之后"); await task; async Task DoSomethingAsync(){ await Task.Delay(10000); Console.WriteLine("等我一秒钟"); } ``` 输出结果是: ```csharp 调用 DoSomethingAsync 之前 调用 DoSomethingAsync 之后 等我一秒钟 ``` 几个关键的地方是 * async 方法必须返回一个Task * 一个 Task 可以被异步执行,程序继续往下执行主线逻辑 * 一个 Task,可以被 await(异步等待) * 通过 await 一个Task,则必须等待异步任务完成后才继续往下执行 下面关于 async, await 说法错误的是? ## 答案 ```csharp // 以下代码的输出是 // == // "调用 DoSomethingAsync 之前" // "调用 DoSomethingAsync 之后" // "等我一秒钟" // Console.WriteLine("调用 DoSomethingAsync 之前"); Task task = DoSomethingAsync(); Console.WriteLine("调用 DoSomethingAsync 之后"); await task; async Task DoSomethingAsync(){ await Thread.Sleep(1000); Console.WriteLine("等我一秒钟"); } ``` ## 选项 ### A ```csharp // 以下代码的输出是 // == // "调用 DoSomethingAsync 之前" // "等我一秒钟" // "调用 DoSomethingAsync 之后" // Console.WriteLine("调用 DoSomethingAsync 之前"); Task task = DoSomethingAsync(); Console.WriteLine("调用 DoSomethingAsync 之后"); await task; async Task DoSomethingAsync(){ Task.Delay(10000); Console.WriteLine("等我一秒钟"); } ``` ### B ```csharp // 以下代码的输出是 // == // "调用 DoSomethingAsync 之前" // "调用 DoSomethingAsync 之后" // Console.WriteLine("调用 DoSomethingAsync 之前"); Task task = DoSomethingAsync(); Console.WriteLine("调用 DoSomethingAsync 之后"); async Task DoSomethingAsync(){ Thread.Sleep(1000); Console.WriteLine("等我一秒钟"); } ``` ### C ```csharp // 以下代码的输出是 // == // "调用 DoSomethingAsync 之前" // "调用 DoSomethingAsync 之后" // "等我一秒钟" // Console.WriteLine("调用 DoSomethingAsync 之前"); Task task = DoSomethingAsync(); Console.WriteLine("调用 DoSomethingAsync 之后"); await task; async Task DoSomethingAsync(){ Task delay = Task.Delay(1000); await delay; Console.WriteLine("等我一秒钟"); } ```