Parallel processing 如何使用IAsyncEnumerable进行并行化

Parallel processing 如何使用IAsyncEnumerable进行并行化,parallel-processing,task-parallel-library,c#-8.0,iasyncenumerable,Parallel Processing,Task Parallel Library,C# 8.0,Iasyncenumerable,我的情况是,我正在启动Task-s,我希望它们的结果以某种方式以管道方式尽可能快地排到数据结构中,而不在乎它们的顺序 IAsyncEnumerable是否适合这种情况 公共异步任务BigMethod() { 队列=新队列(); foreach(RunJobsAsync()中的var项) { 排队。排队(项目); } //wait foreach(wait RunIAsyncJobsAsync()中的var项) // { //排队。排队(项目); // } //[更多代码] } 无IAsyncE

我的情况是,我正在启动
Task-s
,我希望它们的结果以某种方式以管道方式尽可能快地排到数据结构中,而不在乎它们的顺序

IAsyncEnumerable
是否适合这种情况

公共异步任务BigMethod()
{
队列=新队列();
foreach(RunJobsAsync()中的var项)
{
排队。排队(项目);
}
//wait foreach(wait RunIAsyncJobsAsync()中的var项)
// {
//排队。排队(项目);
// }
//[更多代码]
}
IAsyncEnumerable
公共异步任务等待someMethodAsync());
}
等待任务。何时(任务);
返回任务。选择(x=>x.Result);
}
使用
IAsyncEnumerable
公共异步IAsyncEnumerable RunIAsyncJobsAsync()
{
foreach(可枚举范围(01100)中的变量x)
{
返回wait Task.Run(async()=>wait someMethodAsync());
}
}
iasynceneumerable
是否有任何性能提升,因为我希望在所有
async
调用完成之前,不要继续使用该算法,但我希望它们并行执行,因此,我不想顺序地等待所有调用,我只想等待最长的调用完成


p.S在这种情况下,我需要一个
ConcurrentQueue
/locking吗?

否,
IAsyncEnumerable
不适合这种情况。因为在所有异步操作完成之前,您不想再进一步,所以不打算利用
IAsyncEnumerable
s的主要资产。也就是说:一旦结果可用,就立即进行流式处理。返回
任务
,或者更好的返回
任务
,更简单、更可取。特别是如果您还希望同时启动操作,这是
IAsyncEnumerable
默认情况下不执行的操作,而且它是要实现的。

您的
someMethodAsync
CPU绑定还是IO绑定?我认为两者都是,它从文件读取(异步)我意识到我不需要尽快收集结果。我想我可以一路用流媒体播放。@Bercovicadrian我希望你有充分的理由使用流媒体播放方式,因为它会使你的应用程序变得相当复杂。您可能需要考虑缓冲容量、背压等因素。