首页 > 解决方案 > 尝试在 .NET Core 3.0 中同步执行 foreach 循环时出现明显问题

问题描述

我正在尝试使用 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似乎是同步发生的。

我遇到了麻烦——也许是因为缺乏咖啡因——看看有什么解决办法。

标签: c#asp.netasp.net-core

解决方案


如果执行 foreach 的顺序无关紧要,我建议这样:

 Parallel.ForEach(processingModel.breakpoints.Where(b => (b <= processingModel.width)), (breakpoint) =>
            {
                ProcessAsync(processingModel, breakpoint);
            });

推荐阅读