首页 > 解决方案 > 这样写任务收益回报可以吗?

问题描述

我们知道我们可以用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;
}

这么好吗?有什么问题或者我应该注意什么?

标签: c#.net

解决方案


这么好吗?

不,因为它不会编译。

您正在尝试实现一个异步迭代器,它需要返回一个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


推荐阅读