Parallel.For - обработать массив - неправильные индексы - C#
Формулировка задачи:
У меня есть список objClass.listRect. В элементе списка objClass.listRect хранятся координаты области, в которой находится объект. Мне нужно выделить каждый объект и провести с ним некоторые манипуляции.
Я делаю следующим образом:
в результате при выводе обнаруживается что некоторые одни и те же объекты были по 2-3 раза обработаны, а некоторые наоборот, обработаны не были. Вывод - проблема с индексами.
Проблема здесь objClass.listRect[a*i+a])
и здесь
[a * iTotalCountInParallel + a]
не все объекты обрабатываются. Не могу понять, почему проблема с индексами.
Нужно чтобы все учитывались. из указанного списка.
Для того чтобы окончательно убедиться что проблема именно с индексами, я все индексы сохранил в List<> и вывел их и вот результат:
1;2;4;11;8;7;3;0;9;10;6;5;2;14;4;22;20;8;10;0;18;12;6;16;33;12;27;21;15;30;3;0;9;6;24;18;20;4;16;28;8;36;44;32;0;24;12;4 0;15;0;10;5;
Проблема с индексами. Что я делаю не так?
List<int> array1 = new List<int>(); for (int i = 0; i < iTotalCountInParallel; i++) { int iCycle = -1; Parallel.For(0, iCoresCount, parOps, a => { iCycle++; objClass.allObjects.Add(new OneObject(src, objClass.imgBinarized, objClass.listRect[a*i+a])); array1.Add(a * i + a); }); } //для оставшихся элементов int iOstatok = objClass.listRect.Count - iCoresCount * iTotalCountInParallel; Parallel.For(0, iOstatok, parOps, a => { objClass.allObjects.Add(new OneObject(src, objClass.imgBinarized, objClass.listRect[a * iTotalCountInParallel + a])); array1.Add(a * iTotalCountInParallel + a); }); //сохранение if (checkBoxSeveResults.Checked) { for (int i = 0; i < objClass.listRect.Count; i++) { MyFilesWork.Save_jpg(i, textBoxWorkFolder.Text, objClass.allObjects[i].imgObject, objClass.allObjects[i].imgSegmentedObject); } } richTextBox1.Text = ""; foreach (int v in array1) { richTextBox1.Text += v.ToString() + ";"; }
Решение задачи: «Parallel.For - обработать массив - неправильные индексы»
textual
Листинг программы
private void ProcessSingleObject(int index) { objClass.allObjects.Add(new OneObject(src, objClass.imgBinarized, objClass.listRect[index])); if (checkBoxSeveResults.Checked) { MyFilesWork.Save_jpg(index, textBoxWorkFolder.Text, objClass.allObjects[index].imgObject, objClass.allObjects[index].imgSegmentedObject); } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д