c# - 尝试在 .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
似乎是同步发生的。
我遇到了麻烦——也许是因为缺乏咖啡因——看看有什么解决办法。
解决方案
如果执行 foreach 的顺序无关紧要,我建议这样:
Parallel.ForEach(processingModel.breakpoints.Where(b => (b <= processingModel.width)), (breakpoint) =>
{
ProcessAsync(processingModel, breakpoint);
});
推荐阅读
- reactjs - 在 ag 网格中单击节点的复选框后,有没有办法防止列组折叠?
- r - 如何放大树状图以便被吞没的标签可以重新出现?
- kotlin - 房间数据库 - 将数据库中的值与用户输入进行比较以进行验证
- hangfire - 使 Hangfire 仪表板全宽(和自定义样式)
- python - 坐标的唯一标识符 (place_id)
- java - 使用 Google Sheets API (v4) 格式化单元格(输入 Duration)
- npm - 无法使用 AWS-SDK 浏览 hello world
- .net - .NET MVC SignalR 无法访问 sendImage
- python - 日期时间格式的 ax.twiny()
- android-studio - 将 Android Studio 升级到北极狐 2020.3.1 后,Android 模拟器出现颗粒感或像素化