Как насчет этого:
public static void Example<T>(IEnumerable<T> files)
{
T SlowOperation1(T item)
{
// Do Slow operation1
return item;
}
string SlowOperation2(T item, string previousResult)
{
// Do Slow operation2 and return result
return null;
}
var results = files.AsParallel()
.Select(SlowOperation1)
.WithPreviousResult<T, string>(SlowOperation2);
foreach (var result in results)
{
// Write result
}
}
public static IEnumerable<T> WithPreviousResult<T, TU>(this IEnumerable<T> self, Func<T, TU, TU> method)
{
TU previous = default;
using (var iter = self.GetEnumerator())
{
while (iter.MoveNext())
{
previous = method(iter.Current, previous);
yield return iter.Current;
}
}
}
Вызов .AsParallel()
должен обеспечить параллельное выполнение SlowOperation1
, а WithPreviousResult
- SlowOperation2
последовательно. Обратите внимание, что первый элемент получит значение NULL в качестве предыдущего значения. Замените string
на любой тип, полученный из SlowOperation2
. Все это предполагает, что SlowOperation1
ограничено временем процессора, а не вводом-выводом, в противном случае его параллельная работа может не помочь и может даже снизить производительность.
Отказ от ответственности: Не проверено