繁体   English   中英

无法从“oncurrentBag”转换<T> &#39; 到 &#39;功能<ConcurrentBag<T> &gt;&#39;

[英]Cannot convert from 'oncurrentBag<T>' to 'Func<ConcurrentBag<T>>'

我正在尝试使用 Parallel For 循环,它将帮助我加速处理器密集型计算,然后将这些计算添加到线程安全列表中,我可以在 for 循环完成后访问该列表,以便我可以访问数据。 我按照https://docs.microsoft.com/en-us/dotnet/standard/parallel-programming/how-to-write-a-parallel-for-loop-with-thread-local-variables 中的示例进行操作

我在粗体行中遇到编译时错误,由于我是多线程新手,如果您能指出我犯的任何错误,我将不胜感激,以便我可以从这个错误中吸取教训。

public static async Task Test()
    {
        Vector<double> vectorArrayBuy = null;
        Vector<double> vectorArraySell = null;
        ConcurrentBag<DailyStockData> query;

        query = new ConcurrentBag<DailyStockData>();
        ConcurrentBag<MultipleRegressionInfo> listMRInfo = new ConcurrentBag<MultipleRegressionInfo>();                
        Calculations calcTemp = new Calculations();

        **Parallel.For<ConcurrentBag<MultipleRegressionInfo>>(0, 200, (listMRInfo) = new ConcurrentBag<MultipleRegressionInfo>(), (j, loop, listMRInfoLocal) =>**
        {
            int k = Convert.ToInt32(j);
            Calculations calc = new Calculations(query, k);
            var targetValueBuy = calc.ListCalculationData.Select(i => i.MRTargetValueBuy).ToList();
            var targetValueSell = calc.ListCalculationData.Select(i => i.MRTargetValueSell).ToList();
            vectorArrayBuy = CreateVector.Dense(targetValueBuy.ToArray());
            vectorArraySell = CreateVector.Dense(targetValueSell.ToArray());
            var name = calc.ListCalculationData.First();
            ConcurrentBag<double> value;

            value = new ConcurrentBag<double>(calc.ListCalculationData.Select(i => i.WilliamsR));
            MultipleRegressionInfo r1 = Rn(value, vectorArrayBuy, nameof(name.WilliamsR), k, calc);
            listMRInfoLocal.Add(r1);
        calcTemp = calc;

            return listMRInfoLocal;
        },
        (variable) => listMRInfo = variable
        );
listMRInfo = new ConcurrentBag<MultipleRegressionInfo>(listMRInfo.OrderByDescending(i => i.RSquared).DistinctBy(i => i.ValueName).ToList()); // trying to access this data after parallel for loop completes

public class DailyStockData
{
    public DailyStockData();

    public int ID { get; set; }
    public string Symbol { get; set; }
    public string Market { get; set; }
    public DateTime Date { get; set; }
    public decimal Open { get; set; }
    public decimal High { get; set; }
    public decimal Low { get; set; }
    public decimal Close { get; set; }
    public decimal AdjustedClose { get; set; }
    public long Volume { get; set; }
}

public class CalculationData
{
    public CalculationData(CalculationData calcData)
    {
        Date = calcData.Date;
        Open = calcData.Open;
        High = calcData.High;
        Low = calcData.Low;
        Close = calcData.Close;
        AdjustedClose = calcData.AdjustedClose;
        Volume = calcData.Volume;
        WilliamsR = calcData.WilliamsR;
}

    public CalculationData() { }

    public DateTime Date { get; set; }
    public double Open { get; set; }
    public double High { get; set; }
    public double Low { get; set; }
    public double Close { get; set; }
    public double AdjustedClose { get; set; }
    public double Volume { get; set; }
    public double WilliamsR { get; set; }
}

看起来您正在尝试使用比您需要的更复杂的Parallel.For函数重载。 listMRinfo是一个并发类,因此在 for 循环的每次迭代中直接访问此变量是安全的。

Parallel.For<ConcurrentBag<MultipleRegressionInfo>>(0, 200, (index) =>
{
    // ...
    listMRInfo.Add(r1);
});

另一方面,您不应该在没有某种锁定的情况下在循环的每次迭代中更新对calcTemp的引用。 即使使用锁定,我也不认为您应该存储循环的一次迭代中的值。 这是一个并行的foreach,因此在循环完成后,您无法保证calcTemp的值来自哪个迭代

你的问题在这里:

... (listMRInfo) = new ConcurrentBag<MultipleRegressionInfo>() ...

Parallel.For没有重载,其第三个参数接受T ,最佳匹配是这个:

Parallel.For<TLocal> Method (Int32, Int32, Func<TLocal>, Func<Int32, ParallelLoopState, TLocal, TLocal>, Action<TLocal>)

而且,正如错误所说, TLocal不能隐式转换为Func<TLocal> 由于该参数没有意义,因为已经分配了listMRInfo ,您应该这样做:

Parallel.For<ConcurrentBag<MultipleRegressionInfo>>(0, 200, (j, loop, listMRInfoLocal) => 
{
    ... 
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM