编写异步函数
- 对于任何异步函数,你可以使用Task替代void作为返回类型,让该方法称为更有效的异步(可以进行await)。
```csharp
async Task Main()
{
await PrintAnswerToLife();
}
// 这里方法会void也可以,但是返回void,Main并不能await
async Task PrintAnswerToLife()
{
await Task.Delay(5000);
int answer = 21 * 2;
Console.WriteLine(answer);
}
- 并不需要在方法体中显示的返回Task。编译器会生成一个Task(当方法完成或发生异常时),这使得创建异步的调用链非常方便。
```csharp
async Task Main()
{
await Go();
}
async Task Go()
{
await PrintAnswerToLife();
Console.WriteLine("Done");
}
async Task PrintAnswerToLife()
{
await Task.Delay(5000);
int answer = 21 * 2;
Console.WriteLine(answer);
}
- 编译器会对返回Task的异步函数进行扩展,使其成为当发送信号或发生故障时使用TaskCompletionSource来创建Task的代码。(代码类似于下面)
```csharp
async Task Main()
{
await Go();
}
async Task Go()
{
await PrintAnswerToLife();
Console.WriteLine(“Done”);
}
//async Task PrintAnswerToLife()
//{
// await Task.Delay(5000);
// int answer = 21 * 2;
// Console.WriteLine(answer);
//}
Task PrintAnswerToLife()
{
var tcs = new TaskCompletionSource