c# - 这样写任务收益回报可以吗?
问题描述
我们知道我们可以用yield return
一个迭代器方法来返回一个元素,例如:
public IEnumerable<int> MyMethod(){
yield return 0;
...//Lots of code here;
yield return secondResult;//Just for illustration
}
public void Main(){
foreach(int i in MyMethod()){
DoSomething();
}
}
在上面编写的代码中,MyMethod()
将停止执行,yield return
直到请求 的下一个结果foreach
,在这种情况下,每次完成DoSomething()
. 我认为,由于DoSomething()
和MyMethod()
实际上彼此独立,因此可以使它们并行执行。如果这两种方法计算量很大,这将变得越来越重要。我想做什么看起来像这样:
public IEumerable<int> MyMethod(){
Task<int> task = GetNextAsync();//Prepare for next return
yield return 0;
yield return await task;
}
这么好吗?有什么问题或者我应该注意什么?
解决方案
这么好吗?
不,因为它不会编译。
您正在尝试实现一个异步迭代器,它需要返回一个IAsyncEnumerable<T>
,以及使用async
关键字来启用await
:
public async IAsyncEnumerable<int> MyMethodAsync()
{
Task<int> task = GetNextAsync();//Prepare for next return
yield return 0;
yield return await task;
}
有什么问题或者我应该注意什么?
只是这需要使用await foreach
而不是标准来使用foreach
:
await foreach (var i in MyMethodAsync())
或者你可以使用System.Linq.Async
推荐阅读
- python - 如何在 Keras 中为 Bi-LSTM 准备 2D 形状
- apache-flink - Apache Flink 中的 AsyncIO 异常
- kotlin - 如何修复“kotlin.UninitializedPropertyAccessException:lateinit 属性 mockNetwork 尚未初始化”?
- mongodb - MongoDB - 使用 Group By 和 Order By 选择计数
- asp.net - Internet Explorer 无法识别小数点
- javascript - 是否可以为远程服务器上的文件创建下载链接?
- r - 如何在列表元素之间添加虚线?
- navigation - 为什么我们需要一个从粗到细的策略来解决实践中的光流问题(特征跟踪)?
- javascript - 无法访问对象内的键
- python - 在 SQLite SELECT 语句中使用 Python 正则表达式代码