Распараллеливание рекурсивного метода - C#
Формулировка задачи:
Реализую метод медианного сечения квантования изображений:
http://www.intuit.ru/studies/courses/993/163/lecture/4513?page=3
Если кратко о его сути: сортируем массив пикселей по цветовому каналу с наибольшей разницей минимального и максимального значения, делим массив пополам и делаем то же самое с этими половинками, пока в итоге не массивов будет не столько, сколько нам нужно цветов, и потом усредняем значения цветовых каналов в каждом из этих массивов.
Сейчас метод выглядит так:
Производительностью доволен: всё работает очень быстро (всего 7 секунд для 4к изображения не на самом сильном ноутбучном процессоре); но почему-то приложение продолжает выполняться после даже вывода изображения (которое происходит после вызова функции) и кушать память в течение достаточно долгого времени. Что я делаю не так?
private static void Algorithm(Pixel[] array)
{
if (array.Length <= ArrayLen / 65536)
{
//усреднение значений цветовых каналов в массиве и их вывод за пределы функции
}
else
{
Pixel[] newArray1 = new Pixel[array.Length / 2],
newArray2 = new Pixel[array.Length / 2];
SortPixels(ref array, GetSortOrder(array)); //сортировка массива по каналу с наибольшим range
newArray1 = array.Take(array.Length / 2).ToArray();
newArray2 = array.Skip(array.Length / 2).ToArray();
Task thread1 = Task.Factory.StartNew(() =>
{
Algorithm(newArray1);
});
Task thread2 = Task.Factory.StartNew(() =>
{
Algorithm(newArray2);
});
}
}Решение задачи: «Распараллеливание рекурсивного метода»
textual
Листинг программы
private static async Task Algorithm(Pixel[] array)
{
for (int segmentLength = array.Length; segmentLength > ArrayLen / 65536; segmentLength /= 2)
{
var sortTasks = new List<Task>();
for (int startIndex = 0; startIndex < array.Length; startIndex += segmentLength)
{
int partitionEndIndex = Math.Min(array.Length, startIndex + segmentLength);
sortTasks.Add(Task.Run(() => SortPixels(array, startIndex, partitionEndIndex, GetSortOrder(array, startIndex, partitionEndIndex)))); //сортировка массива по каналу с наибольшим range)
}
await Task.WhenAll(sortTasks);
}
//усреднение значений цветовых каналов в массиве и их вывод за пределы функции
}