До тех пор, пока сам метод Function () не генерирует слишком много конфликтов (блокировка ресурсов) - что, по вашему описанию, не похоже на это, а затраты на метод функции (в ресурсах) достаточно велики ( в основном это накладные расходы на разделение списка, создание дополнительных потоков и т. д., поэтому ваш выигрыш должен амортизировать эту стоимость), тогда да.
c # имеет несколько встроенных методов для обработки подобных ситуаций, вы можете использовать PLINQ
var y = matricesList.AsParallel().Where(m =>Function(m)).First();
(при этом будет оцениваться каждый элемент в списке и возвращено первое найденное значение) - так что если есть побочный эффект оценки, который вы хотите, это то, что вы хотите
Если вы хотите, чтобы PLINQ прерывался после одного совпадения, просто добавьте .Take (1) в
var y = matricesList.AsParallel().Where(m =>Function(m)).Take(1).First();
или библиотека параллельных задач
Parallel.ForEach(matricesList, (m, parallelLoopState) =>
{
if (Function(m))
{
parallelLoopState.Stop();
}
});
Это приведет к тому, что каждый элемент в списке будет оцениваться до тех пор, пока функция (m) не вернет true, а затем прервать и прекратить оценку других элементов.
Оба метода будут обрабатывать правильное разбиение, используя правильное количество потоков для числа процессоров в системе и т. Д.