所以我花了大半夜的时间试图弄清楚这一点。
我很幸运昨天被介绍到了parallel.foreach,它就像我想要的那样工作,除了一个细节。
我有以下内容:
Parallel.ForEach(data, (d) =>
{
try
{
MyMethod(d, measurements);
}
catch (Exception e)
{
// logg
}
});
在“MyMethod”方法中,我完成了很多逻辑,其中大部分都很好,但是我在获取数据的地方进行 api 调用,并且我使用异步任务为此能够使用“await”以便代码等到该特定部分被执行,然后继续:
private async void MyMethod(PimData pimData, IEnumerable<ProductMeasurements> measurements)
{
try
{
// alot of logic but most relevant part
await Task.WhenAll(ExecuteMeasurmentAndChartLogic(pimData.ProductNumber, entity));
await Task.WhenAll(resourceImportManager.HandleEntityImageFiles(pimData.ProductType + pimData.ProductSize,SwepImageType.Png, ResourceFileTypes.ThreeD, entity, LinkTypeId.ProductResource));
await Task.WhenAll(resourceImportManager.HandleEntityImageFiles(pimData.ProductSketch, SwepImageType.Png, ResourceFileTypes.Sketch, entity, LinkTypeId.ProductResource));
}
catch (Exception e)
{
// logg
}
}
问题:
1 对于初学者,循环在所有代码完成之前完成
2 第二个问题是我在很多 api 调用中得到“任务被取消”
3 和上面提到的第三个,代码不等待每个方法完全执行。
在继续下一步之前,我无法让它执行 ExecuteMeasurmentAndChartLogic() 方法中的所有内容。
这给了我以下问题(更多问题):
在这种方法中,我创建了一个项目并将其添加到数据库中,并且该项目需要我从 ExecuteMeasurmentAndChartLogic() 内部完成的 api 调用中获得的更多信息,但问题是创建了几个项目并且必须等待其余的数据不是我想要的。
旁注:我知道在所有数据都没有最佳实践之前创建一个项目并添加到数据库中,但我正在向 PIM 集成,并且这个过程很微妙
我希望运行多个线程,但同时我希望在继续下一个方法之前为每个项目执行完整的逻辑。
阐明:
运行的几个项目
在进入下一部分代码之前,每个项目都会处理它需要处理的所有逻辑,通常使用 await 来执行此操作。
在上面的代码中,resourceImportManager() 方法在 ExecuteMeasurmentAndChartLogic() 完成之前执行。这是我不想要的。
而不是 Parallel.ForEach 我使用:
Task task1 = Task.Factory.StartNew(() => MyMethod(data, measurements));
Task.WaitAll(task1);
但这没什么帮助
对此相当陌生,并且无法理解我在哪里做错了。
编辑:更新了这个问题
编辑:这就是 ExecuteMeasurmentAndChartLogic() 的样子:
public async Task ExecuteMeasurmentAndChartLogic(string productNumber, Entity entity)
{
try
{
GrafGeneratorManager grafManager = new GrafGeneratorManager();
var graphMeasurmentList = await MeasurmentHandler.GetMeasurments(productNumber);
if (graphMeasurmentList.Count == 0) return;
var chart = await grafManager.GenerateChart(500, 950, SystemColors.Window, ChartColorPalette.EarthTones,
"legend", graphMeasurmentList);
await AddChartsAndAddToXpc(chart, entity, productNumber);
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
编辑:背景:我调用 api 来获取大量数据。对于此数据中的每个项目,我需要进行 api 调用并获取应用于该项目的数据。
在阅读了让我以不同方式思考的评论之后。我也许可以遍历我的所有项目并为它们做一些次要逻辑,并在任务列表中添加一个 url 并制作一个单独的任务来逐个执行这个任务。
将保持更新