gpt4 book ai didi

c# - 在 .net Core、C# 中并行调用 API 调用的最佳方式是什么?

转载 作者:行者123 更新时间:2023-11-30 20:14:52 26 4
gpt4 key购买 nike

我想并行调用我的 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");

使用操作 block 的第三种方法 - 这是我认为我应该一直做的,但我想听听社区的意见

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");

最佳答案

接近 2 号。这是一条经验法则:I/O 绑定(bind)操作=> 使用 Tasks/WhenAll(异步),计算绑定(bind)操作 => 使用并行。 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 postResponses = new List<string>();

foreach (var t in tasks) {
var postResponse = await t; //t.Result would be okay too.
postResponses.Add(postResponse);
Console.WriteLine(postResponse);
}

关于c# - 在 .net Core、C# 中并行调用 API 调用的最佳方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58348864/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com