当前位置: 首页 > news >正文

定义一组抽象的 Awaiter 的实现接口,你下次写自己的 await 可等待对象时将更加方便

我在几篇文章中都说到了在 .NET 中自己实现 Awaiter 情况。async / await 写异步代码用起来真的很爽,就像写同步一样。然而实现 Awaiter 没有现成的接口,它需要你按照编译器的要求为你的类型添加一些具有特定名称的属性和方法。然而没有接口的帮助,我们编写起来就很难获得工具(如 ReSharper)自动生成代码的支持。

本文将分享我提取的自己实现 Awaiter 的接口。你只需要实现这些接口当中的 2 个,就能正确实现一个 Awaitable 和 Awaiter。


本文内容

      • 接口代码
      • 接口实现
      • 实现业务需求
      • 更多 Awaiter 系列文章

接口代码

你可以在 GitHub 上找到这段代码:https://github.com/walterlv/sharing-demo/blob/master/src/Walterlv.Core/Threading/AwaiterInterfaces.cs。

public interface IAwaitable<out TAwaiter> where TAwaiter : IAwaiter
{
    TAwaiter GetAwaiter();
}

public interface IAwaitable<out TAwaiter, out TResult> where TAwaiter : IAwaiter<TResult>
{
    TAwaiter GetAwaiter();
}

public interface IAwaiter : INotifyCompletion
{
    bool IsCompleted { get; }

    void GetResult();
}

public interface ICriticalAwaiter : IAwaiter, ICriticalNotifyCompletion
{
}

public interface IAwaiter<out TResult> : INotifyCompletion
{
    bool IsCompleted { get; }

    TResult GetResult();
}

public interface ICriticalAwaiter<out TResult> : IAwaiter<TResult>, ICriticalNotifyCompletion
{
}

接口实现

在 ReSharper 工具的帮助下,你可以在继承接口之后快速编写出实现代码来:

使用 ReSharper 快速实现 Awaiter
▲ 使用 ReSharper 快速实现 Awaiter

使用 ReSharper 快速实现 Awaitable
▲ 使用 ReSharper 快速实现 Awaitable

于是我们可以迅速得到一对可以编译通过的 Awaitable 和 Awaiter:

public sealed class Awaiter : IAwaiter<string>
{
    public void OnCompleted(Action continuation)
    {
        throw new NotImplementedException();
    }

    public bool IsCompleted { get; }

    public string GetResult()
    {
        throw new NotImplementedException();
    }
}

public sealed class Awaitable : IAwaitable<Awaiter, string>
{
    public Awaiter GetAwaiter()
    {
        throw new NotImplementedException();
    }
}

当然,你也可以在一个类里面实现这两个接口:

public sealed class Awaiter : IAwaiter<string>, IAwaitable<Awaiter, string>
{
    public void OnCompleted(Action continuation)
    {
        throw new NotImplementedException();
    }

    public bool IsCompleted { get; }

    public string GetResult()
    {
        throw new NotImplementedException();
    }

    public Awaiter GetAwaiter()
    {
        return this;
    }
}

实现业务需求

我有另外两篇文章在实现真正可用的 Awaiter:

  • 在 WPF/UWP 中实现一个可以用 await 异步等待 UI 交互操作的 Awaiter
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?

更多 Awaiter 系列文章

入门篇:

  • .NET 中什么样的类是可使用 await 异步等待的?
  • 定义一组抽象的 Awaiter 的实现接口,你下次写自己的 await 可等待对象时将更加方便
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?

实战篇:

  • 在 WPF/UWP 中实现一个可以用 await 异步等待 UI 交互操作的 Awaiter
  • .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter

相关文章:

  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?
  • .NET 中什么样的类是可使用 await 异步等待的?
  • Visual Studio 2017 以前的旧格式的 csproj Import 进来的 targets 文件有时不能正确计算属性(PropertyGroup)和集合(ItemGroup)
  • 使用 ReSharper,输入即遵循 StyleCop 的代码格式化规范
  • StyleCop 是什么,可以帮助团队带来什么价值?
  • 文件和文件夹不存在的时候,FileSystemWatcher 监听不到文件的改变?如果递归地监听就可以了
  • C#/.NET 使用 CommandLineParser 来标准化地解析命令行
  • .NET 中使用 TaskCompletionSource 作为线程同步互斥或异步操作的事件
  • 使用 WPF 开发一个 Windows 屏幕保护程序
  • 在 Windows 10 中开启移动 WLAN 热点
  • .NET/C# 项目如何优雅地设置条件编译符号?
  • 在 Roslyn 分析语法树时添加条件编译符号的支持
  • 自然码的形码
  • 出于迁移项目的考虑,GitHub 中 Fork 出来的项目,如何与原项目断开 Fork 关系?
  • 只需 5 秒钟,你就能取到 WPF 程序的超高分辨率超高清截图
  • 【Leetcode】104. 二叉树的最大深度
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • Fundebug计费标准解释:事件数是如何定义的?
  • Git的一些常用操作
  • java 多线程基础, 我觉得还是有必要看看的
  • Java反射-动态类加载和重新加载
  • JS实现简单的MVC模式开发小游戏
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • Spring Cloud Feign的两种使用姿势
  • 聊聊sentinel的DegradeSlot
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 如何进阶一名有竞争力的程序员?
  • 如何优雅地使用 Sublime Text
  • 使用 @font-face
  • 我的面试准备过程--容器(更新中)
  • 用 Swift 编写面向协议的视图
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • 1.Ext JS 建立web开发工程
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • 昨天1024程序员节,我故意写了个死循环~
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • (C++17) optional的使用
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (二)windows配置JDK环境
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (转)ABI是什么
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • .net core Swagger 过滤部分Api
  • .NET Core Web APi类库如何内嵌运行?
  • .net中调用windows performance记录性能信息
  • .vimrc php,修改home目录下的.vimrc文件,vim配置php高亮显示
  • .vue文件怎么使用_我在项目中是这样配置Vue的
  • // an array of int
  • @我的前任是个极品 微博分析
  • [ element-ui:table ] 设置table中某些行数据禁止被选中,通过selectable 定义方法解决
  • [100天算法】-目标和(day 79)