.NET 中的 async
/ await
写异步代码用起来真的很爽,就像写同步一样。我们可以在各种各样的异步代码中看到 Task
返回值,这样大家便可以使用 await
等待这个方法。不过,有时需要写一些特别的异步方法,这时需要自己来实现一个可以异步等待的对象。
本文将讲述如何实现一个可等待对象,一个自定义的 Awaiter。
Awaiter 系列文章
入门篇:
- .NET 中什么样的类是可使用 await 异步等待的?
- 定义一组抽象的 Awaiter 的实现接口,你下次写自己的 await 可等待对象时将更加方便
- .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?
实战篇:
可等待对象
我们希望大家在调用下面的 CallWalterlvAsync
方法的时候,可以使用 await
关键字来异步等待:
await CallWalterlvAsync();
public WalterlvOperation CallWalterlvAsync()
{
// 返回一个 WalterlvOperation,以便外面调用方可以异步等待。
return new WalterlvOperation();
}
所以我们需要实现一个 WalterlvOperation
。
编写基本的 Awaiter 框架代码
先写一个空的类型,然后为它编写一个空的 GetAwaiter
方法,返回新的 WalterlvAwaiter
类型。
/// <summary>
/// 委托 walterlv 来完成一项特殊的任务。
/// 通过在代码当中调用,可以让他在现实中为你做一些事情。
/// </summary>
public class WalterlvOperation
{
public WalterlvAwaiter GetAwaiter()
{
return new WalterlvAwaiter();
}
}
接着,我们编写 WalterlvAwaiter
类:
public class WalterlvAwaiter : INotifyCompletion
{
public bool IsCompleted