无法从 'oncurrentBag<T>' 转换为 'Func<ConcurrentBag<T>>'
Cannot convert from 'oncurrentBag<T>' to 'Func<ConcurrentBag<T>>'
我正在尝试使用并行 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; }
}
你的问题在这里:
... (listMRInfo) = new ConcurrentBag<MultipleRegressionInfo>() ...
第三个参数接受T
的Parallel.For
没有重载,最匹配的是这个:
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) =>
{
...
}
看起来您正在尝试使用比您需要的更复杂的 Parallel.For
函数重载。 listMRinfo
是并发的 class,因此在 for 循环的每次迭代中直接访问此变量是安全的。
Parallel.For<ConcurrentBag<MultipleRegressionInfo>>(0, 200, (index) =>
{
// ...
listMRInfo.Add(r1);
});
另一方面,在没有进行某种锁定的情况下,您不应该在循环的每次迭代中更新对 calcTemp
的引用。即使使用锁定,我也不认为您应该存储循环的 one 迭代中的值。这是一个 parallel foreach,所以在循环完成后,你无法保证 哪次迭代 得到 calcTemp
的值来自.
我正在尝试使用并行 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; }
}
你的问题在这里:
... (listMRInfo) = new ConcurrentBag<MultipleRegressionInfo>() ...
第三个参数接受T
的Parallel.For
没有重载,最匹配的是这个:
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) =>
{
...
}
看起来您正在尝试使用比您需要的更复杂的 Parallel.For
函数重载。 listMRinfo
是并发的 class,因此在 for 循环的每次迭代中直接访问此变量是安全的。
Parallel.For<ConcurrentBag<MultipleRegressionInfo>>(0, 200, (index) =>
{
// ...
listMRInfo.Add(r1);
});
另一方面,在没有进行某种锁定的情况下,您不应该在循环的每次迭代中更新对 calcTemp
的引用。即使使用锁定,我也不认为您应该存储循环的 one 迭代中的值。这是一个 parallel foreach,所以在循环完成后,你无法保证 哪次迭代 得到 calcTemp
的值来自.