我有一个返回异步枚举器的方法
public async IAsyncEnumerable<IResult> DoWorkAsync()
{
await Something();
foreach (var item in ListOfWorkItems)
{
yield return DoWork(item);
}
}
和来电者:
public async Task LogResultsAsync()
{
await foreach (var result in DoWorkAsync())
{
Console.WriteLine(result);
}
}
因为DoWork
这是一项昂贵的操作,我更喜欢以某种方式并行化它,所以它的工作方式类似于:
public async IAsyncEnumerable<IResult> DoWorkAsync()
{
await Something();
Parallel.ForEach(ListOfWorkItems, item =>
{
yield return DoWork(item);
});
}
但是我不能从内部进行收益回报,Parallel.Foreach
所以只是想知道最好的方法是什么?
返回结果的顺序无关紧要。
谢谢。
编辑:对不起,我遗漏了一些代码DoWorkAsync
,它确实在等待我没有把它放在上面的代码中的东西,因为这与问题不太相关。现已更新
Edit2: DoWork
在我的情况下,主要是 I/O 绑定,它从数据库中读取数据。