。net Core,C#中并行校准API调用的最佳方法是什么?

问题描述 投票:0回答:1

我想并行调用我的API x次,因此可以快速完成处理。我下面有三种方法必须并行调用API。我试图了解哪种方法是执行此操作的最佳方法。

基本代码

var client = new System.Net.Http.HttpClient();
            client.DefaultRequestHeaders.Add("Accept", "application/json");

            client.BaseAddress = new Uri("https://jsonplaceholder.typicode.com");
            var list = new List<int>();

            var listResults = new List<string>();
            for (int i = 1; i < 5; i++)
            {
                list.Add(i);
            }

使用Parallel.ForEach的第一种方法

           Parallel.ForEach(list,new ParallelOptions() { MaxDegreeOfParallelism = 3 }, index =>
            {
                var response = client.GetAsync("posts/" + index).Result;

                var contents =  response.Content.ReadAsStringAsync().Result;
                listResults.Add(contents);
                Console.WriteLine(contents);
            });

            Console.WriteLine("After all parallel tasks are done with Parallel for each");

带有任务的第二种方法。我不确定这是否并行。让我知道是否可以

var loadPosts = new List<Task<string>>();
            foreach(var post in list)
            {
                var response = await client.GetAsync("posts/" + post);

                var contents = response.Content.ReadAsStringAsync();
                loadPosts.Add(contents);
                Console.WriteLine(contents.Result);
            }

            await Task.WhenAll(loadPosts);

            Console.WriteLine("After all parallel tasks are done with Task When All");

使用动作块的第三种方法-我相信这是我应该一直做的,但我希望听到社区的声音


            var responses = new List<string>();

            var block = new ActionBlock<int>(
                async x => {
                    var response = await client.GetAsync("posts/" + x);
                    var contents = await response.Content.ReadAsStringAsync();
                    Console.WriteLine(contents);
                    responses.Add(contents);                
                },
                new ExecutionDataflowBlockOptions
                {
                    MaxDegreeOfParallelism = 6, // Parallelize on all cores
                });

            for (int i = 1; i < 5; i++)
            {
                block.Post(i);
            }

            block.Complete();
            await block.Completion;

            Console.WriteLine("After all parallel tasks are done with Action block");

c# asp.net-core parallel-processing task-parallel-library
1个回答
0
投票

方法2已关闭。这是一条经验法则:I / O绑定操作=>使用Tasks / WhenAll(异步),计算绑定操作=>使用并行性。 Http请求是网络I / O。

            foreach (var post in list)
            {
                async Task<string> func()
                {
                    var response = await client.GetAsync("posts/" + post);
                    return await response.Content.ReadAsStringAsync();
                }

                tasks.Add(func());
            }

            await Task.WhenAll(tasks);

            var loadPosts = new List<string>();

            foreach (var t in tasks) {
                loadPosts.Add(await t);
                Console.WriteLine(await t);
            }
© www.soinside.com 2019 - 2024. All rights reserved.