Вложенные Parallel.For

245
08 декабря 2017, 01:51

В принципе, я более менее понял суть того, чтобы данные в потоках не пересекались, но что делать, если у меня есть в потоке свои вложенные потоки, как быть здесь?

 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.

Answer 1

как можно решить проблему?

Дочитав до конца документацию.

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.

READ ALSO
Как получить ссылку href из a-тега с Xpath

Как получить ссылку href из a-тега с Xpath

Имеется вот такой кусок html кода :

266
Хождений по строкам в файле (C#)

Хождений по строкам в файле (C#)

Есть файл "iobin" и содержит это:

275
Почему не декодируется base64 из склеенных строк?

Почему не декодируется base64 из склеенных строк?

Доброго всем! Есть строка, которая выдает ошибку при конвертации:

257
Замена слова/подстроки в строке из Dictionary (Regex IgnoreCase?)

Замена слова/подстроки в строке из Dictionary (Regex IgnoreCase?)

ЗдравствуйтеИмеется строка, например:

391