Очевидная проблема при попытке синхронно выполнить цикл foreach в .NET Core 3.0 - PullRequest
0 голосов
/ 07 октября 2019

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

Это мой код:

public async static Task ProcessBreakpointsAsync(ProcessingModel processingModel, bool squeezeOnly = false) {
    new LoggerExtensions().LogStatus("Image Extensions: ProcessBreakpointsAsync(processingModel): " + DateTime.Now.ToString(), "Performance");
    List<Task> listOfTasks = new List<Task>();
    listOfTasks.Add(ProcessAsync(processingModel, 0, true));

    foreach (int breakpoint in processingModel.breakpoints.Where(b => (b <= processingModel.width))) {
        listOfTasks.Add(ProcessAsync(processingModel, breakpoint));
    }

    await Task.WhenAll(listOfTasks);
}



private static Task ProcessAsync(ProcessingModel processingModel, int breakpoint, bool squeezeOnly = false) {
    new LoggerExtensions().LogStatus("Image Extensions: ProcessAsync(processingModel, " + breakpoint.ToString() + "): " + DateTime.Now.ToString(), "Performance");
    ProcessedImageModel optimizedImage = new ProcessedImageModel();
    optimizedImage = processingModel.input.Slice(breakpoint, squeezeOnly).Squeeze();
    processingModel.cache.Set(optimizedImage.ID.ToString(), optimizedImage, processingModel.memoryCacheEntryOptions); 
    processingModel.imageCollection.Add(optimizedImage);
    return Task.CompletedTask;  
}

Вы увидите, что я создаю список задач и жду, когда все задачизавершены. Это похоже на работу. Однако - согласно записи, которую я пишу, - обработка, которая происходит внутри ProcessAsync, кажется, происходит синхронно.

У меня проблемы - возможно, из-за недостатка кофеина - посмотреть, чторешение будет.

1 Ответ

1 голос
/ 07 октября 2019

Если порядок выполнения foreach не имеет значения, я предлагаю что-то вроде этого:

 Parallel.ForEach(processingModel.breakpoints.Where(b => (b <= processingModel.width)), (breakpoint) =>
            {
                ProcessAsync(processingModel, breakpoint);
            });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...