我寻求有关如何利用yield关键字在并行块或Task块中返回IEnumberable的帮助。下面是伪代码
public IEnumerable<List<T>> ReadFile( )
{
foreach (string filepath in lstOfFiles)
{
var stream = new FileStream(filepath , FileMode.Open, FileAccess.Read);
foreach (var item in ReadStream(stream))
yield return item; //where item is of type List<string>
}
}
我想将上面的代码转换为如下所示的并行块
lstOfFiles.AsParallel()
.ForAll(filepath =>
{
var stream = new FileStream(filepath , FileMode.Open, FileAccess.Read);
foreach (var item in ReadStream(Stream))
yield return item;
});
但是编译器抛出错误,即Yield无法在并行块或匿名委托(delegate)中使用。我也尝试了任务块,任务匿名委托(delegate)中不允许 yield
任何人都建议我一种最简单,最好的方法,让自己的 yield 以并行块或任务的形式返回数据收集。
我读到RX 2.0或TPL在上述情况下很好用。我怀疑是否要使用RX或TPL库来异步返回值的产生。谁能建议我Rx或TPL哪个更好。
如果我使用Rx,是否有必要创建订阅并转换并行块AsObservable。
最佳答案
看来您想使用SelectMany
。您不能在匿名方法中使用yield
,但是可以将其分解为一个新方法,如下所示:
IEnumerable<Item> items = lstOfFiles.AsParallel()
.SelectMany(( filepath ) => ReadItems(filepath));
IEnumerable<Item> ReadItems(string filePath)
{
using(var Stream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
foreach (var item in ReadStream(Stream))
yield return item;
}
}
关于c# - 如何使用yield返回并行块或Task中的Item集合,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27671917/