C# 5.0 异步中的可等待和等待者

2024-01-21

Task 或Task 对象是可等待的,因此我们可以对返回值为Task 或Task 的对象使用await 键。 Task 或 Task 是最常用的可等待对象。

我们还可以定义自己的可等待对象。该对象应该具有以下资格。

  1. 它有一个 GetAwaiter() 方法(实例方法或扩展方法);
  2. Its GetAwaiter() method returns an awaiter. An object is an awaiter if:
    • 它实现 INotifyCompletion 或 ICriticalNotifyCompletion 界面;
    • 它有一个 IsCompleted,它有一个 getter 并返回一个布尔值;
    • 它有一个 GetResult() 方法,该方法返回 void 或结果。

我的问题是,为什么微软不提供一个接口来约束这些可等待的对象? 当前实现可等待对象的方法有点复杂。


Lucian Wischik 的博客文章给出了最好的回答为什么异步方法必须返回 Task? http://blogs.msdn.com/b/lucian/archive/2012/11/22/why-must-async-methods-return-task.aspx

总而言之(我并没有公正地对待这篇博文,你应该阅读它),问题是Task已经存在,所以引入一个接口意味着

  • 所有内部方法都需要更改为接口,这是一个重大更改,因此框架人员几乎不可能愿意这样做。
  • 作为一名程序员,你经常需要决定是否要返回Task或者界面,这个决定并不重要。
  • 编译器总是需要一个具体类型,因此即使您从方法返回一个接口,它仍然会被编译为Task.

上述影响是如此之大,以至于提供一个接口是没有意义的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# 5.0 异步中的可等待和等待者 的相关文章

  • 如何使用GDB修改内存内容?

    我知道我们可以使用几个命令来访问和读取内存 例如 print p x 但是如何更改任何特定位置的内存内容 在 GDB 中调试时 最简单的是设置程序变量 参见GDB 分配 http sourceware org gdb current onl
  • 未解决的包含:“cocos2d.h” - Cocos2dx

    当我在 Eclipse 中导入 cocos2dx android 项目时 我的头文件上收到此警告 Unresolved inclusion cocos2d h 为什么是这样 它实际上困扰着我 该项目可以正确编译并运行 但我希望这种情况消失
  • 获取没有非标准端口的原始 url (C#)

    第一个问题 环境 MVC C AppHarbor Problem 我正在调用 openid 提供商 并根据域生成绝对回调 url 在我的本地机器上 如果我点击的话 效果很好http localhost 12345 login Request
  • 如果使用 SingleOrDefault() 并在数字列表中搜索不在列表中的数字,如何返回 null?

    使用查询正数列表时SingleOrDefault 当在列表中找不到数字时 如何返回 null 或像 1 这样的自定义值 而不是类型的默认值 在本例中为 0 你可以使用 var first theIntegers Cast
  • WPF TabControl,用C#代码更改TabItem的背景颜色

    嗨 我认为这是一个初学者的问题 我搜索了所有相关问题 但所有这些都由 xaml 回答 但是 我需要的是后台代码 我有一个 TabControl 我需要设置其项目的背景颜色 我需要在选择 取消选择和悬停时为项目设置不同的颜色 非常感谢你的帮助
  • 如何返回 json 结果并将 unicode 字符转义为 \u1234

    我正在实现一个返回 json 结果的方法 例如 public JsonResult MethodName Guid key var result ApiHelper GetData key Data is stored in db as v
  • 如何将图像路径保存到Live Tile的WP8本地文件夹

    我正在更新我的 Windows Phone 应用程序以使用新的 WP8 文件存储 API 本地文件夹 而不是 WP7 API 隔离存储文件 旧的工作方法 这是我如何成功地将图像保存到 共享 ShellContent文件夹使用隔离存储文件方法
  • 从路径中获取文件夹名称

    我有一些路c server folderName1 another name something another folder 我如何从那里提取最后一个文件夹名称 我尝试了几件事 但没有成功 我只是不想寻找最后的 然后就去休息了 Thank
  • 从库中捕获主线程 SynchronizationContext 或 Dispatcher

    我有一个 C 库 希望能够将工作发送 发布到 主 ui 线程 如果存在 该库可供以下人员使用 一个winforms应用程序 本机应用程序 带 UI 控制台应用程序 没有 UI 在库中 我想在初始化期间捕获一些东西 Synchronizati
  • C++ 复制初始化和直接初始化,奇怪的情况

    在继续阅读本文之前 请阅读在 C 中 复制初始化和直接初始化之间有区别吗 https stackoverflow com questions 1051379 is there a difference in c between copy i
  • C++ fmt 库,仅使用格式说明符格式化单个参数

    使用 C fmt 库 并给定一个裸格式说明符 有没有办法使用它来格式化单个参数 example std string str magic format 2f 1 23 current method template
  • 将文本叠加在图像背景上并转换为 PDF

    使用 NET 我想以编程方式创建一个 PDF 它仅包含一个背景图像 其上有两个具有不同字体和位置的标签 我已阅读过有关现有 PDF 库的信息 但不知道 如果适用 哪一个对于如此简单的任务来说最简单 有人愿意指导我吗 P D 我不想使用生成的
  • 32 位到 64 位内联汇编移植

    我有一段 C 代码 在 GNU Linux 环境下用 g 编译 它加载一个函数指针 它如何执行并不重要 使用一些内联汇编将一些参数推送到堆栈上 然后调用该函数 代码如下 unsigned long stack 1 23 33 43 save
  • 为什么 C# Math.Ceiling 向下舍入?

    我今天过得很艰难 但有些事情不太对劲 在我的 C 代码中 我有这样的内容 Math Ceiling decimal this TotalRecordCount this PageSize Where int TotalRecordCount
  • Process.Start 阻塞

    我正在调用 Process Start 但它会阻止当前线程 pInfo new ProcessStartInfo C Windows notepad exe Start process mProcess new Process mProce
  • 如何使用 std::string 将所有出现的一个字符替换为两个字符?

    有没有一种简单的方法来替换所有出现的 in a std string with 转义 a 中的所有斜杠std string 完成此操作的最简单方法可能是boost字符串算法库 http www boost org doc libs 1 46
  • ASP.NET MVC 6 (ASP.NET 5) 中的 Application_PreSendRequestHeaders 和 Application_BeginRequest

    如何在 ASP NET 5 MVC6 中使用这些方法 在 MVC5 中 我在 Global asax 中使用了它 现在呢 也许是入门班 protected void Application PreSendRequestHeaders obj
  • 限制C#中的并行线程数

    我正在编写一个 C 程序来生成并通过 FTP 上传 50 万个文件 我想并行处理4个文件 因为机器有4个核心 文件生成需要更长的时间 是否可以将以下 Powershell 示例转换为 C 或者是否有更好的框架 例如 C 中的 Actor 框
  • 使用 libcurl 检查 SFTP 站点上是否存在文件

    我使用 C 和 libcurl 进行 SFTP FTPS 传输 在上传文件之前 我需要检查文件是否存在而不实际下载它 如果该文件不存在 我会遇到以下问题 set up curlhandle for the public private ke
  • 使用按位运算符相乘

    我想知道如何使用按位运算符将一系列二进制位相乘 但是 我有兴趣这样做来查找二进制值的十进制小数值 这是我正在尝试做的一个例子 假设 1010010 我想使用每个单独的位 以便将其计算为 1 2 1 0 2 2 1 2 3 0 2 4 虽然我

随机推荐

  • 有没有快速、实用的素数生成器?

    假设我有一个自然数n我想要一个包含所有素数的列表 或其他 n 经典的素筛算法运行在O n log n 时间和O n 空间 对于命令式语言来说这很好 但需要从根本上对列表和随机访问进行就地修改 有一个涉及优先级队列的功能版本 非常灵活 你可以
  • 如何根据完成的选择选择视图控制器

    这个问题与this https stackoverflow com questions 13743777 show all tabs with scrolling option on screen there should be only
  • 理解特异性:在不使用 !important [重复] 的情况下实现所需的选择器结果

    这个问题在这里已经有答案了 我试图理解特异性 in CSS 我目前的理解是特异性与继承非常相似 但在某种程度上定义更具体 Mozilla 特异性定义 https developer mozilla org en docs Web CSS S
  • 如何为下一个子例程保留该变量的值?

    我是一名初级程序员 没有经验 正在为我现在正在做的工作学习 Visual Basic 我读了一天左右 终于决定开始制作所需的程序了 但是 我遇到了一些问题 现在我有两个子程序 第一个子例程让用户输入他们有多少个数据对 以便我可以创建一个表供
  • clojure类型转换字符串到符号

    在 clojure 中我有向量 myfn1 myfn2 myfn3 我如何使用该向量中的字符串调用名为 myfn1 的函数 调用绑定到 Var 的函数myfn1给定字符串 myfn1 你可以这样做 resolve symbol myfn1
  • Spring security/hibernate:即使它们是正确的,凭证也不好?

    嘿 我的基于 springsecurity 的登录有点混乱 我不断收到错误 凭据错误 这是我的用户表 用户表 1 这是我的 applicationContext 中的数据源
  • 如何在 PowerShell 中解析来自 Invoke-WebRequest 的 JSON?

    当向服务器发送 GET 请求时 使用自签名证书 add type using System Net using System Security Cryptography X509Certificates public class Trust
  • Docker 远程 API 是否有等效的“docker run --rm ...”?

    我希望能够在容器退出后轻松清理它们 这可以通过远程 API 实现吗 除了我自己发现出口并使用 DELETE containers 端点删除 拉斯克斯的答案现在已经过时了 Docker 远程 API 1 25shifted rm从客户端到服务
  • 如何使用 python 或(和)ruby 卸载任何应用程序

    我没有通过这个问题在网上找到任何有用的主题 这些都是关于如何卸载 python 或卸载 ruby 但没有关于 TOPIC 的信息 主要问题是我使用了其他有趣的answers https stackoverflow com questions
  • GDI泄漏问题

    我注意到使用任务管理器 以下代码中存在 GDI 泄漏 每次执行此代码时 执行此代码的进程中 GDI 对象的计数都会增加 1 但我似乎找不到问题 任何帮助 将不胜感激 create new DC based on current HDC hD
  • 如何让网页高度适合屏幕高度

    我需要使我的网页高度适合屏幕尺寸的高度而不滚动 HTML
  • 使用 R ggplot2 和 ggplotly 在地图上一年的累积点

    我正在尝试在地图上累计绘制每个月打开的新位置 我可以每月创建一个包含新位置的动画 但不能累积 换句话说 我希望看到新地点添加到现有地点 这是示例数据 DF lt data frame latitude c 42 29813 41 83280
  • 从 WooCommerce 购物车错误消息中删除库存数量

    在 WooCommerce 中 我将 woocommerce gt settings gt products gt inventory gt stock display format 设置为 永远不要显示剩余库存数量 但是 如果客户将产品广
  • 将 Numpy 数组保存为图像(说明)

    我在之前的帖子中找到了答案 将 Numpy 数组保存为图像 https stackoverflow com questions 902761 saving a numpy array as an image 唯一的问题是 没有太多关于使用
  • 在 Python/Bash 中通过 SSH/Sudo 测试文件/目录是否存在 [重复]

    这个问题在这里已经有答案了 我正在远程服务器上安装证书 并想在覆盖它们之前检查它们是否存在 服务器仅允许通过 ssh 公钥进行非 root 访问 我可以sudo s在 shell 中 root 一次 需要 root 权限 因为其他人无法读取
  • Play 框架模板自动导入模型。_ 除其他外

    似乎在 Play 框架模板中 有一个隐式的 import models 和 import play api data Form 因为我的代码 title String myForm Form User 无需在第一行后放置显式导入语句即可工作
  • ASP运行在64位环境下,使用Access数据库

    我有一位客户自 2003 年以来一直在运行一个使用 asp 3 0 构建的简单网站 其中包含一个 access 数据库文件 mdb 最近 该客户购买了一台带有 Windows 2003 Server 64 位的新服务器 该网站不再运行 显示
  • WMI 调用获取驱动程序

    我是 WMI 的新手 它是什么 例如 我可以在 C 中使用 WMI 调用来获取我的 PC 上的驱动程序列表吗 如果是这样 我该打电话给哪个班级 要列出已安装的驱动程序 您可以使用Win32 PnPSignedDriver http msdn
  • Python 中的球形 k 均值实现

    我一直在使用scipy 的 k 均值 http docs scipy org doc scipy reference cluster vq html已经有一段时间了 我对它在可用性和效率方面的工作方式感到非常满意 然而 现在我想探索不同的
  • C# 5.0 异步中的可等待和等待者

    Task 或Task 对象是可等待的 因此我们可以对返回值为Task 或Task 的对象使用await 键 Task 或 Task 是最常用的可等待对象 我们还可以定义自己的可等待对象 该对象应该具有以下资格 它有一个 GetAwaiter