.NET 4.x Массивы задач - C#
Формулировка задачи:
В общем, необходимо распараллелить генерацию и обработку массива данных. Почитал про задачи, потоки, TPL, вроде бы проникся, начал писать непосредственно код, и столкнулся с проблемами (код привожу обобщенный).
Однако подобный код не работает, вылетает AggregateException. StackOverFlow советует добавить следующий код, и эксепшн действительно прекращает вылетать:
Однако, данные не генерируются. Писать напрямую в генерируемый массив пробовал, но подобный код вызывает гонку, и необходимое число элементов не набирается. Просьба знатокам помочь разобраться.
List<Point> startValues;
List<Task> taskList;
int N;
void Init()//инициализирую
{
startValues = new List<Point>();
taskList = new List<Task>();
N = 20;
}
void GenerateData(int num)//непосредственно генерация
{
Random rand = new Random();
for (int i = 0; i < 50000 / N; i++)
{
parallelData[num].Add(new Point((double)(rand.Next(200) - 100) / 100.0, (double)(rand.Next(200) - 100) / 100.0));
}
}
void Gen()//попытка параллелить
{
for (int i = 0; i < N; i++)
{
parallelData.Add(new List<Point>());
taskList.Add(Task.Factory.StartNew(() => GenerateData(i)));
}
Task.WaitAll(taskList.ToArray());
ConcatData();
}
void ConcatData()//объединение сгенерированных массивов в один
{
for (int i = 0; i < N; i++)
{
startValues.AddRange(parallelData[i]);
}
} try
{
Task.WaitAll(taskList.ToArray());
}
catch (AggregateException)
{
}Решение задачи: «.NET 4.x Массивы задач»
textual
Листинг программы
int x = i; taskList.Add(Task.Factory.StartNew(() => GenerateData(x)));