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

学习AspNet

我想并行调用我的API次数,以便可以快速完成处理。我下面有三种方法必须并行调用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");
尤利·邦纳(Yuli Bonner)

方法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 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);
            }

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

.NET Core中的SOAP?

来自分类Dev

在.NET 4.5.2中引用.NET Core库

来自分类Dev

.NET Core中的Ninject

来自分类Dev

.NET Core设置-最佳实践

来自分类Dev

在.Net Core中设置UserTokenProvider

来自分类Dev

.Net Core 3.0中的BrowserLink

来自分类Dev

共享ASP.NET Core 3.1启动和控制器中使用的配置对象的最佳方法是什么

来自分类Dev

.NET Core EF core中对dbcontext的并行调用

来自分类Dev

.net Core HttpPost方法ajax调用

来自分类Dev

.NET Core中的Computehash方法

来自分类Dev

.Net Core API方法未调用

来自分类Dev

.NET Core中的HttpClientHandler UseDefaultCredentials

来自分类Dev

在ASP.Net Core 3.1中等待SqlClient调用的最佳方法

来自分类Dev

.net core 2.1 CORS API

来自分类Dev

.NET Core中的主键继承

来自分类Dev

.NET Core中的DI问题

来自分类Dev

在.NET Core MVC中持久保存筛选器,分页和排序的最佳方法是什么

来自分类Dev

在.NET Core 3.1中关闭C#套接字的正确方法是什么?

来自分类Dev

从ASP .NET C#中的数据表创建.xls的最佳方法是什么?

来自分类Dev

MVC .NET Core - 调用方法

来自分类Dev

C# .NET Core 中的谓词

来自分类Dev

dot net core中基于web api调用的派生配置

来自分类Dev

.NET Core (2.0) 中的参考

来自分类Dev

.NET CORE 时间异步方法

来自分类Dev

在 asp.net core 中更新的最佳方式是什么

来自分类Dev

在 .net core 中调用嵌套依赖

来自分类Dev

.NET Core API LoggerFactory

来自分类Dev

使用asp .net core web api配置react js应用程序的最佳方法是什么

来自分类Dev

ILogger 类型的 C# .NET Core 属性