C# iSyncEnumerable与lt;T>;vs IEnumerable<;任务<;T>>;?

C# iSyncEnumerable与lt;T>;vs IEnumerable<;任务<;T>>;?,c#,.net,asynchronous,async-await,streaming,C#,.net,Asynchronous,Async Await,Streaming,新的C#8.0和dotnet core 3具有AsyncStreams(IAsyncEnumerable)的这一新特性。我的理解是,它提供了一种异步处理流中项目的方法。但是如果使用IEnumerable,我就不能做到这一点吗 这两种方法的区别是什么?使用Task和IAsyncEnumerable来枚举整个数据或遍历数据列表。然而,两者之间存在着巨大的差异。 Task在收集中的数据准备好发送给调用方后提供记录 然而,IAsyncEnumerable在记录准备就绪时提供记录,这意味着它将在记录可用时

新的C#8.0和dotnet core 3具有AsyncStreams(
IAsyncEnumerable
)的这一新特性。我的理解是,它提供了一种异步处理流中项目的方法。但是如果使用
IEnumerable
,我就不能做到这一点吗

这两种方法的区别是什么?

使用
Task
IAsyncEnumerable
来枚举整个数据或遍历数据列表。然而,两者之间存在着巨大的差异。
Task
在收集中的数据准备好发送给调用方后提供记录

然而,
IAsyncEnumerable
在记录准备就绪时提供记录,这意味着它将在记录可用时向您发送记录,而不是等待整个集合被填满。它提供了使用yield关键字异步迭代集合的功能,这在C#8.0之前是不可能的


在使用异步枚举时,了解什么线程是安全的,什么线程是不安全的是很重要的。

如何使与
IEnumerable
异步?一个是可以异步枚举的枚举(即异步等待下一个元素返回),另一个只是任务的枚举。我可以说c#8的异步流可以实现开箱即用的背压吗?我认为背压并不完全正确,因为这通常更多地是关于生产者比消费者快得多(或者至少我是这样理解背压的)。当生产者比消费者慢得多时,异步枚举会帮助您,例如,因为生产者受I/O限制(如网络查询),因为现在程序可以在等待新项目到达时执行其他操作。感谢@ckuri的解释。我想我现在已经很好地理解了这种差异。在我看来,我仍然会把它与背压联系起来。因为在支持背压的流中,一个关键概念是消费者能够异步等待元素处理,然后需要更多的数据。在我看来,类似的事情也可以通过dotnet异步流实现。再次感谢你。我为这部电影感到非常兴奋。问题是关于
IEnumerable
,而不是
Task