-
C# Task 使用 WhenAll 请求远程分页接口
首先WhenAll 是什么?
-所有提供的任务已完成时,创建将完成的任务-
-Creates a task that will complete when all of the supplied tasks have completed-
Task.WhenAll()
方法是 C# 中用于等待多个任务(Task
)完成的一种方式。它不会控制并发数量,而是等待所有传递给它的任务都完成后才会继续执行下一步操作。这意味着一旦所有任务都完成,无论这些任务是如何并发执行的,Task.WhenAll()
方法才会返回。
具体用法还是去看官方文档,这是最好的教程: .NET Core 官方教程-Task.WhenAll()
请求远程分页接口并返回实体数据
我这里写的通用模板,用的Task.
我这里为了控制并发数量,使用 SemaphoreSlim
来控制同时执行的任务数量。
SemaphoreSlim
用于控制并发数量,确保同时只有最大数量的任务在执行。每个任务在开始执行时获取信号量,完成后释放信号量,这样可以确保同时执行的任务数量不会超过预定的最大并发数。
请注意,这只是一种控制并发数量的方式之一。
以下就是我的示例:
public async Task<Result<IEnumerable<T>>> RequestRemoteDatas<T>(string token, TableDataQueryParams param, int maxConcurrentTasks = -1) { try { var content = new StringContent(JsonConvert.SerializeObject(param), Encoding.UTF8, Application.Json); var client = _httpClientFactory.CreateClient(); client.DefaultRequestHeaders.Add("X-Access-Token", token); //client.Timeout = TimeSpan.FromSeconds(30); string url = AppSettings.TableDataHost + AppSettings.TableDataQueryUri; // 发送post请求 HttpResponseMessage response = await client.PostAsync(url, content); var responseContent = await response.Content.ReadAsStringAsync(); var result = JsonConvert.DeserializeObject<QueryApiResult>(responseContent); if (!result.success || result.code != 200) { return Result.BadRequest<IEnumerable<T>>(result.message); } var records = JsonConvert.DeserializeObject<PlatformManagerDto<T>>(result.result.ToString()); if (records == null) { return Result.NotFound<IEnumerable<T>>(); } var dtos = new List<T>(); if (records.Records.Any()) { dtos.AddRange(records.Records); } if(records.Pages > 1) { var tasks = new List<Task<Result<IEnumerable<T>>>>(); SemaphoreSlim? semaphore = null; if (maxConcurrentTasks >= 0) { //Maximum number of concurrent writes semaphore = new SemaphoreSlim(maxConcurrentTasks); } for (int i = 2; i <= records.Pages; i++) { int index = i; tasks.Add(Task.Run(async () => { param.pageNo = index; var content1 = new StringContent(JsonConvert.SerializeObject(param), Encoding.UTF8, Application.Json); if (semaphore != null) { semaphore.Wait(); } try { // Perform task operations // 发送post请求 HttpResponseMessage response1 = await client.PostAsync(url, content1); var responseContent1 = await response1.Content.ReadAsStringAsync(); var result1 = JsonConvert.DeserializeObject<QueryApiResult>(responseContent1); if (!result1.success || result1.code != 200) { return Result.BadRequest<IEnumerable<T>>(result1.message); } var records_next = JsonConvert.DeserializeObject<PlatformManagerDto<T>>(result1.result.ToString()); if (records_next == null) { return Result.NotFound<IEnumerable<T>>(); } return Result.Success(records_next.Records); } catch (Exception ex) { return Result.BadRequest<IEnumerable<T>>(ex.Message); } finally { if (semaphore != null) { semaphore.Release(); } } } )); } var continuation = Task.WhenAll(tasks); continuation.Wait(); if (continuation.Status == TaskStatus.RanToCompletion) { foreach (var result1 in continuation.Result) { if (result1.Code != 200) { return Result.BadRequest<IEnumerable<T>>(result1.Msg); } dtos.AddRange(result1.Data); } } } return Result.Success(dtos.AsEnumerable()); } catch (Exception ex) { return Result.BadRequest<IEnumerable<T>>(ex.Message); } }
总之,这篇博客希望能够为您提供有价值的信息,并激发您的思考。
或者,您有更好的建议欢迎在评论区留言。
出处:https://www.cnblogs.com/junsun-blogs-home/p/17622979.html
栏目列表
最新更新
python爬虫及其可视化
使用python爬取豆瓣电影短评评论内容
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
uniapp/H5 获取手机桌面壁纸 (静态壁纸)
[前端] DNS解析与优化
为什么在js中需要添加addEventListener()?
JS模块化系统
js通过Object.defineProperty() 定义和控制对象
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比