AsyncAwait.md 2.7 KB
Newer Older
F
feilong 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
# 异步任务(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("等我一秒钟");
}
```