相关疑难解决方法(0)

我可以等待我用发电机创建的可枚举数吗?

假设我有异步获得的整数序列.

async Task<int> GetI(int i){
    return await Task.Delay(1000).ContinueWith(x => i);
}
Run Code Online (Sandbox Code Playgroud)

我想在该序列上创建一个生成器,如果序列是同步的,我会这样做:

IEnumerable<int> Method()
{
    for (var i = 0; i < 100; i++)
    {
        yield return GetI(i); // won't work, since getI returns a task
    }
}
Run Code Online (Sandbox Code Playgroud)

所以,我认为类比是让生成器异步并从中产生:

async Task<IEnumerable<int>> Method()    
{
    for (var i = 0; i < 100; i++)
    {
        yield return await Task.Delay(1000).ContinueWith(x => i);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是行不通的,因为一个yield必须返回某个IEnumerable东西的方法,替代方案,这更有意义IEnumerable<Task<int>>但是由于async方法必须返回Tasks或void,所以不能编译.

现在,我意识到我可以简单地删除await并返回一个,IEnumerable<Task<int>>但这对我没有帮助,因为迭代将在任何数据准备好之前继续询问数据,因此它不能解决我的问题.

  • 有没有什么方法可以很好地混合可枚举和任务与语言给我等待和收益的好糖?
  • 有没有办法很好地消费它?

(从网上搜索,我怀疑回答的第一个问题是假的,第二个是一个观察者/可观察的,但我找不到任何标准基准和我感兴趣的最好的方式来实现在C#这种模式)

c# asynchronous generator promise async-await

13
推荐指数
1
解决办法
2515
查看次数

标签 统计

async-await ×1

asynchronous ×1

c# ×1

generator ×1

promise ×1