发送几个异步API请求并并行处理响应的正确方法是什么?

我有一个项目列表,对于每个项目,我需要执行几个异步API请求并处理响应,我已经看到了几个实现,在执行时间上它们都相似,但是我想知道它们之间的区别。

方法1

Parallel.ForEach(items, new ParallelOptions { MaxDegreeOfParallelism = 10 }, item =>
        {
            var response = item.propertyOne.GetAsync().GetAwaiter().GetResult();
            //process it
            var response = item.propertyTwo.GetAsync().GetAwaiter().GetResult();
            //process it
            var response = item.propertyThree.GetAsync().GetAwaiter().GetResult();
            //process it
        });

方法2

Parallel.ForEach(items, new ParallelOptions { MaxDegreeOfParallelism = 10 }, item =>
        {
            Task.Run(async () =>
            {
                var response = await item.propertyOne.GetAsync();
            }).GetAwaiter().GetResult();
            //process it
            Task.Run(async () =>
            {
                var response = await item.propertyTwo.GetAsync();
            }).GetAwaiter().GetResult();
            //process it
            Task.Run(async () =>
            {
                var response = await item.propertyThreee.GetAsync();
            }).GetAwaiter().GetResult();
            //process it
        });

方法3假定应用了某种限制机制,以免系统充斥任务

List<Task> tasksToAwait = new List<Task>();
        foreach (var item in items)
        {
            tasksToAwait.Add(Task.Run(async () =>
            {
                var response = await item.propertyOne.GetAsync();
                //process it
                var response = await item.propertyTwo.GetAsync();
                //process it
                var response = await item.propertyThree.GetAsync();
                //process it
            }));
        }
        await Task.WhenAll(taskToAwait);

笔记:

  • 我正在使用GetAwaiter()。GetResult()而不是Wait(),因为它不会吞噬异常。
  • 必须以某种方式等待请求才能处理响应。
  • 这是作为后台任务执行的,所以我不介意阻塞调用线程。
  • 第三种方法比其他两种方法略快,第二种方法比第一种略快。
  • 我无法控制通过GetAsync()调用的异步API。

建议使用其中哪一项?如果没有,则建议什么?此外,它们有何不同?为什么执行时间有所不同?

评论
liste
liste

使用Parallel.Foreach并将所有任务添加到List中,并使用WhenAll方法等待所有任务完成。

点赞
评论