В принципе, я более менее понял суть того, чтобы данные в потоках не пересекались, но что делать, если у меня есть в потоке свои вложенные потоки, как быть здесь?
Parallel.For(5, 15, TF =>
{
Bars = CompressTo(BarsStart, TF);
int countBars = Bars.Count;
profitSave = 0;
Parallel.For(0, 10000, j =>
{
int fastPeriod = rnd.Next(10, 100);
int slowPeriod = rnd.Next(fastPeriod, 300);
List<double> Fast = iMa.MA.SMA(Bars, fastPeriod);
List<double> Slow = iMa.MA.SMA(Bars, slowPeriod);
int i = 0;
for (i = 0; i < countBars - 1; i++)
{
// Здесь я использую Fast, Slow,Bars и рассчитываю profit
}
lock (locker)
if (profit > profitSave)
profitSave = profit;
});
});
Если сделать 1 поток, только вложенный, всё прекрасно, но если я хочу использовать 2 потока, то тут пересекаются данные, как можно решить проблему? Изменяется только Bars
- Fast
- Slow
. Получается, в глобальном цикле инициализируется Bars
, а во вложенном цикле на основе Bars инициализируются Fast
и Slow
. Ошибка в том, что Fast
и Slow
бывают инициализируются не от своего созданного Bars
, а от списка из другого потока, а в главном цикле у каждого Bars
разное число элементов и поэтому в просто цикле for
мы ловим исключение OutOfRange
.
как можно решить проблему?
Дочитав до конца документацию.
https://msdn.microsoft.com/en-us/library/dd783299(v=vs.110).aspx
Используйте перегруженный вариант:
public static ParallelLoopResult Parallel.For<TLocal>(
int fromInclusive,
int toExclusive,
Func<TLocal> localInit,
Func<int, ParallelLoopState, TLocal, TLocal> body,
Action<TLocal> localFinally
)
подавая/возвращая Bars
в качестве TLocal
.
Доброго всем! Есть строка, которая выдает ошибку при конвертации:
ЗдравствуйтеИмеется строка, например: