ждать предыдущего элемента в асинхронном цикле c - PullRequest
0 голосов
/ 28 апреля 2020

Я управляю набором файлов по порядку, поскольку для 1 операции может потребоваться информация о предыдущем файле.

Теперь я хотел бы ускорить обработку, начав манипулировать следующим файлом до того, как первый закончил.

но у меня проблемы с поиском, способ начать.

var infoFromPreviousFile;
foreach (var file in Files) {
  file.Open();

  // Two long-running operations that require to run in order but don't require the previous file
  // Time consuming operation 1 on OpenFile Operation
  var newData = // Time consuming operation 2 on OpenFile Operation

  // One fast running operation that requires the previous file
  // requires information of the previous file
  file.Add(infoFromPreviousFile);

  file.Write();
  infoFromPreviousFile = newData;
}

1 Ответ

0 голосов
/ 28 апреля 2020

Как насчет этого:

    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 ограничено временем процессора, а не вводом-выводом, в противном случае его параллельная работа может не помочь и может даже снизить производительность.

Отказ от ответственности: Не проверено

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...