c# - 如何使用 PLINQ 进行延迟加载?

标签 c# lazy-loading plinq

linq 的优点之一是可以根据请求延迟处理无限的数据源。我尝试并行化我的查询,发现延迟加载不起作用。例如……

class Program
{
    static void Main(string[] args)
    {
        var source = Generator();
        var next = source.AsParallel().Select(i => ExpensiveCall(i));
        foreach (var i in next)
        {
            System.Console.WriteLine(i);
        }
    }

    public static IEnumerable<int> Generator()
    {
        int i = 0;
        while (true)
        {
            yield return i;
            i++;
        }
    }

    public static int ExpensiveCall(int arg)
    {
        System.Threading.Thread.Sleep(5000);
        return arg*arg;
    }
}

这个程序没有产生任何结果,大概是因为在每一步,它都在等待对生成器的所有调用都干涸,当然这永远不会。如果我取出“AsParallel”调用,它就可以正常工作。那么,在使用 PLINQ 提高应用程序性能的同时,我该如何实现出色的延迟加载呢?

最佳答案

看看MergeOptions

 var next = source.AsParallel()
              .WithMergeOptions(ParallelMergeOptions.NotBuffered)
              .Select(i => ExpensiveCall(i));

关于c# - 如何使用 PLINQ 进行延迟加载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14680308/

相关文章:

c# - IHttpModule 处理经典 ASP 表单数据

c# - .NET : How to PInvoke UpdateProcThreadAttribute

Angular 5 : Lazy-loading of component without routing

javascript - Angular Universal - 延迟加载问题

c# - 应用程序使用 PLINQ AsParallel() 挂起。 LINQ 没问题

c# - 使用 LINQ 将文本文件解析为 CSV

c# - 每次与转换器绑定(bind)时,按钮单击时的背景颜色变亮

css - 延迟加载和 Isotope - 在 Firefox 中工作,但在 IE 中不工作

c# - 尝试在所有 Linq 查询中使用 Plinq 是否可以?

c# - Boost 数学(ibeta_inv 函数)不是线程安全的?