假设我有异步获得的整数序列.
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#这种模式)