我寻求有关如何利用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/

10-11 19:39