首页 > 解决方案 > “第一个”异步方法是什么样的?

问题描述

如果一个async方法“A”必须await在另一个async方法“B”上,而方法“B”必须await在另一个async方法“C”上,那么方法“C”——“第一个”async方法——是什么样子的?我用谷歌搜索了“如何创建async方法”这个问题。我得到的所有例子都像......方法“C”里面有一些像“Task.Run()”这样的代码。我很困惑。Task.Run()仅适用于 CPU 绑定,不是吗?但是async方法通常用于 I/O 绑定操作。有人可以向我解释一下吗?

标签: c#asynchronousasync-await

解决方案


他们中的许多人都包装了香草异步风格的方法,这些方法接受回调委托,当它完成时将被调用。

请注意,不仅Task可以await编辑匹配以下规则的所有类型实例:

  • 必须有一个AWAITER GetAwaiter()可从 ed 实例调用的方法await(这意味着也接受扩展方法),而AWAITER代表任何符合规则的类型。

  • AWAITER必须实现INotifyCompletion以接受应在异步任务完成时调用的回调委托。

  • AWAITER实例必须有一个bool IsCompleted { get; }定义来检查它是否完成。

  • AWAITERinstance 必须有一个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语法实际上可以让您处理更多情况。


推荐阅读