Как запустить много задач в пакетах меньшего размера? - PullRequest
0 голосов
/ 01 октября 2018

У меня много операций, которые я хочу запустить асинхронно.Я делаю:

var tasks = new List<Task<bool>>();

for(var i=0;i<1000;i++){
  tasks.Add(CreateGeoreferencedImageAsync(properties, scaleIndex, currentXmin, currentYmin, currentXmax, currentYmax));
}

while (tasks.Count > 0)
{
   var bunch = tasks.Take(4).ToList();
   bool[] firstFinishedTask = await Task.WhenAll(bunch);
   tasks.RemoveRange(0,4);
}

Но я вижу, что WhenAll выполняет все задачи из tasks, а не только из bunch.
Что я пропустил?

ОБНОВЛЕНИЕ

private Task<bool> CreateGeoreferencedImageAsync(ImageGenerationProperties 
properties, int scaleIndex,
        double currentXmin, double currentYmin, double currentXmax, double currentYmax)
    {
        return Task.Run(() =>
            {
                return CreateGeoreferencedImage(properties, scaleIndex, currentXmin, currentYmin, currentXmax,
                    currentYmax);
            });
    }

Ответы [ 2 ]

0 голосов
/ 01 октября 2018

Забудьте о задачах и особенно о Task.Run ().

Эту проблему лучше всего решить с помощью Parallel.ForEach().Или Линка AsParallel().

Parallel.For(0, 1000, 
  new ParallelOptions { MaxDegreeOfParallelism = 4 },
  i => CreateGeoreferencedImage(properties, scaleIndex, 
      currentXmin, currentYmin, currentXmax,  currentYmax));
0 голосов
/ 01 октября 2018

WhenAll не выполняет задачи.Он ждет их окончания.Выполнение обычно начинается, как только задача создана, в вашем случае внутри CreateGeoreferencedImageAsync.

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