C# 并行返回值

Posted

技术标签:

【中文标题】C# 并行返回值【英文标题】:C# parallel return value 【发布时间】:2016-09-18 10:58:53 【问题描述】:

我使用以下代码尝试使用来自两个单独数组的值进行一些计算。我一直在尝试聚合一个值列表作为最后一步,但每次我运行程序时,列表中只有一组值。 abcXLoopVars 是一个自定义类,用于存储我稍后聚合的不同变量。

Parallel.For<abcXLoopVars>(0, colX.Count(),
            () =>  return new abcXLoopVars(); ,
            (i, pls, state) =>
        
            state = new abcXLoopVars();
            double x = Math.Abs(colX[i]);
            double y =   Math.Abs(colY[i]);
            double lnx = Math.Log(x);
            double lny = Math.Log(y);
            double xminxbarsq = Math.Pow(colX[i] - xbar, 2);
            double xminxbarcub = Math.Pow(colX[i] - xbar, 4);
            state.sumxminxbarsq = xminxbarsq;
            state.sumxminxbarcub = xminxbarcub;
            state.sumlnxxminxbarsq = lnx * xminxbarsq;
            state.sumlnxlny = lnx * lny;
            state.sumlnxsq = Math.Pow(lnx, 2);
            state.sumlnx = sumlnx + lnx;
            state.sumlnyxminxbarsq = lny * xminxbarsq;
            state.sumlny = lny;
            state.posneg = colY[i] / colX[i];

            return state;
        ,
        (state) =>  lock (lockMe) abxList.Add(state);
        );

【问题讨论】:

【参考方案1】:

我建议你重写为 PLINQ:

    colX.Zip(colY, (x, y) =>
        
            var state = new abcXLoopVars();
            double lnx = Math.Log(x);
            double lny = Math.Log(y);
            double xminxbarsq = Math.Pow(x - xbar, 2);
            double xminxbarcub = Math.Pow(x - xbar, 4);
            state.sumxminxbarsq = xminxbarsq;
            state.sumxminxbarcub = xminxbarcub;
            state.sumlnxxminxbarsq = lnx * xminxbarsq;
            state.sumlnxlny = lnx * lny;
            state.sumlnxsq = Math.Pow(lnx, 2);
            state.sumlnx = sumlnx + lnx;
            state.sumlnyxminxbarsq = lny * xminxbarsq;
            state.sumlny = lny;
            state.posneg = y / x;

            return state;
        ).AsParallel().ToList();

【讨论】:

您应该在.Zip() 之前调用.AsParallel() 以便对您的查询应用一些并行性,否则(如您的情况)查询将按顺序执行。另外你应该在colY上调用.AsParallel(),然后再将它传递给.Zip(),否则会抛出异常。

以上是关于C# 并行返回值的主要内容,如果未能解决你的问题,请参考以下文章

多返回值函数的joblib并行处理

按值返回值而不等待所有值返回异步 C#

SQL返回值 C#语言

C#进阶系列——WebApi 接口返回值不困惑:返回值类型详解

C#函数多返回值的方法

C#怎样定义返回值为List的方法