如何使用异步方法正确编写Parallel.For

我将如何构造下面的代码,以便调用异步方法?

Parallel.For(0, elevations.Count(), delegate(int i) { allSheets.AddRange(await BuildSheetsAsync(userID, elevations[i], includeLabels)); }); 

Parallel.For()async方法不兼容。 如果您不需要限制并行度(即,您可以同时执行所有任务),您只需启动所有Task ,然后等待它们完成:

 var tasks = Enumerable.Range(0, elevations.Count()) .Select(i => BuildSheetsAsync(userID, elevations[i], includeLabels)); List allSheets = (await Task.WhenAll(tasks)).SelectMany(x => x).ToList(); 

我建议你看看我几天前问的这个问题并最终回答自己,基本上我一直在寻找并行和异步的ForEach方法

该方法使用SemaphoreSlim并行处理事物,并接受异步方法作为输入操作。

您可能还想查看我在答案结尾处提供的两个链接,它们对实现此类行为非常有用,而且它们还包含使用Partitioner执行此操作的另一种方法。

就个人而言,我不喜欢Parallel.For因为它是一个同步调用,正如我给出的链接所解释的那样; 我想要所有’异步’:-)

它是: 异步并行地下载文件

Parallel.For调用异步方法的最简单方法是下一步:

 Parallel.For(0, elevations.Count(), async i => { allSheets.AddRange(await BuildSheetsAsync(userID, elevations[i], includeLabels)); }); 

==============

MarioDS在评论中提到绝对正确,在这种情况下,您可能有未观察到的exception。 这绝对是非常重要的事情,你应该始终牢记,然后与异步代表达成协议。

在这种情况下,如果您认为您将拥有exception,则可以在委托中使用try/catch块。 或者在某些情况下,如果您的情况适合它,您可以订阅TaskScheduler.UnobservedTaskException事件。