c# - “第一个”异步方法是什么样的?
问题描述
如果一个async
方法“A”必须await
在另一个async
方法“B”上,而方法“B”必须await
在另一个async
方法“C”上,那么方法“C”——“第一个”async
方法——是什么样子的?我用谷歌搜索了“如何创建async
方法”这个问题。我得到的所有例子都像......方法“C”里面有一些像“Task.Run()”这样的代码。我很困惑。Task.Run()
仅适用于 CPU 绑定,不是吗?但是async
方法通常用于 I/O 绑定操作。有人可以向我解释一下吗?
解决方案
他们中的许多人都包装了香草异步风格的方法,这些方法接受回调委托,当它完成时将被调用。
请注意,不仅Task
可以await
编辑匹配以下规则的所有类型实例:
必须有一个
AWAITER GetAwaiter()
可从 ed 实例调用的方法await
(这意味着也接受扩展方法),而AWAITER
代表任何符合规则的类型。AWAITER
必须实现INotifyCompletion
以接受应在异步任务完成时调用的回调委托。AWAITER
实例必须有一个bool IsCompleted { get; }
定义来检查它是否完成。AWAITER
instance 必须有一个RESULT GetResult()
定义完成的方法await
,whileRESULT
将是await
表达式的结果类型,void
如果没有返回结果则可能是。
例如:
public static TaskAwaiter<T> GetAwaiter<T>(this T target) => Task.FromResult(target).GetAwaiter();
此方法允许await
编辑所有类型,这将立即完成,从而产生值本身。
var x = await 1; // int x = 1;
可以await
编辑任何符合规则的类型,这意味着您可以自己实现它以手动调用回调委托,而无需异步方法。
标准 API 提供TaskCompletionSource<TResult>
了将回调异步操作包装到 的功能Task
,您可能不需要实现自己的可等待类型,但知道什么await
语法实际上可以让您处理更多情况。
推荐阅读
- python - Django request.user 在更改页面后变为匿名。使用自定义用户模型
- google-cloud-firestore - 如何获取管道的输出并对 Cloud Firestore 进行读写
- c++ - c++ - 文本 RPG - 使用函数检查有效输入
- python - 如何在 Python 中将值从一个脚本返回到另一个脚本?
- google-apps-script - 在谷歌表格中保存数据范围的功能有时会复制空白单元格,如何让它暂停并等待源数据刷新?
- vue.js - 如何在 nuxt 中使用带有动态路由的 twilio
- javascript - Javascript Delete 不会触发 Java 后端
- c++ - for循环中的caffe forward net不起作用
- javascript - 点击 div 专注于输入
- css - 这些 W3C CSS 验证警告是关于什么的?