翼度科技»论坛 编程开发 .net 查看内容

C# Task 使用 WhenAll 请求远程分页接口

6

主题

6

帖子

18

积分

新手上路

Rank: 1

积分
18
首先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.WhenAll 的重载方法: WhenAll(IEnumerable tasks)。
我这里为了控制并发数量,使用 SemaphoreSlim 来控制同时执行的任务数量。
SemaphoreSlim 用于控制并发数量,确保同时只有最大数量的任务在执行。每个任务在开始执行时获取信号量,完成后释放信号量,这样可以确保同时执行的任务数量不会超过预定的最大并发数。
请注意,这只是一种控制并发数量的方式之一。
以下就是我的示例:
  1. public async Task<Result<IEnumerable<T>>> RequestRemoteDatas<T>(string token, TableDataQueryParams param, int maxConcurrentTasks = -1)
  2. {
  3.     try
  4.     {
  5.         var content = new StringContent(JsonConvert.SerializeObject(param),
  6.                                         Encoding.UTF8, Application.Json);
  7.         var client = _httpClientFactory.CreateClient();
  8.         client.DefaultRequestHeaders.Add("X-Access-Token", token);
  9.         //client.Timeout = TimeSpan.FromSeconds(30);
  10.         string url = AppSettings.TableDataHost + AppSettings.TableDataQueryUri;
  11.         // 发送post请求
  12.         HttpResponseMessage response = await client.PostAsync(url, content);
  13.         var responseContent = await response.Content.ReadAsStringAsync();
  14.         var result = JsonConvert.DeserializeObject<QueryApiResult>(responseContent);
  15.         if (!result.success || result.code != 200)
  16.         {
  17.             return Result.BadRequest<IEnumerable<T>>(result.message);
  18.         }
  19.         var records = JsonConvert.DeserializeObject<PlatformManagerDto<T>>(result.result.ToString());
  20.         if (records == null)
  21.         {
  22.             return Result.NotFound<IEnumerable<T>>();
  23.         }
  24.         var dtos = new List<T>();
  25.         if (records.Records.Any())
  26.         {
  27.             dtos.AddRange(records.Records);
  28.         }
  29.         if(records.Pages > 1)
  30.         {
  31.             var tasks = new List<Task<Result<IEnumerable<T>>>>();
  32.             SemaphoreSlim? semaphore = null;
  33.             if (maxConcurrentTasks >= 0)
  34.             {
  35.                 //Maximum number of concurrent writes
  36.                 semaphore = new SemaphoreSlim(maxConcurrentTasks);
  37.             }
  38.             for (int i = 2; i <= records.Pages; i++)
  39.             {
  40.                 int index = i;
  41.                 tasks.Add(Task.Run(async () =>
  42.                                    {
  43.                                        param.pageNo = index;
  44.                                        var content1 = new StringContent(JsonConvert.SerializeObject(param),
  45.                                                                         Encoding.UTF8, Application.Json);
  46.                                        if (semaphore != null)
  47.                                        {
  48.                                            semaphore.Wait();
  49.                                        }
  50.                                        try
  51.                                        {
  52.                                            // Perform task operations
  53.                                            // 发送post请求
  54.                                            HttpResponseMessage response1 = await client.PostAsync(url, content1);
  55.                                            var responseContent1 = await response1.Content.ReadAsStringAsync();
  56.                                            var result1 = JsonConvert.DeserializeObject<QueryApiResult>(responseContent1);
  57.                                            if (!result1.success || result1.code != 200)
  58.                                            {
  59.                                                return Result.BadRequest<IEnumerable<T>>(result1.message);
  60.                                            }
  61.                                            var records_next = JsonConvert.DeserializeObject<PlatformManagerDto<T>>(result1.result.ToString());
  62.                                            if (records_next == null)
  63.                                            {
  64.                                                return Result.NotFound<IEnumerable<T>>();
  65.                                            }
  66.                                            return Result.Success(records_next.Records);
  67.                                        }
  68.                                        catch (Exception ex)
  69.                                        {
  70.                                            return Result.BadRequest<IEnumerable<T>>(ex.Message);
  71.                                        }
  72.                                        finally
  73.                                        {
  74.                                            if (semaphore != null)
  75.                                            {
  76.                                                semaphore.Release();
  77.                                            }
  78.                                        }                                
  79.                                    }
  80.                                   ));
  81.             }
  82.             var continuation = Task.WhenAll(tasks);
  83.             continuation.Wait();
  84.             if (continuation.Status == TaskStatus.RanToCompletion)
  85.             {
  86.                 foreach (var result1 in continuation.Result)
  87.                 {
  88.                     if (result1.Code != 200)
  89.                     {
  90.                         return Result.BadRequest<IEnumerable<T>>(result1.Msg);
  91.                     }
  92.                     dtos.AddRange(result1.Data);
  93.                 }
  94.             }
  95.         }
  96.         return Result.Success(dtos.AsEnumerable());
  97.     }
  98.     catch (Exception ex)
  99.     {
  100.         return Result.BadRequest<IEnumerable<T>>(ex.Message);
  101.     }
  102. }
复制代码
总之,这篇博客希望能够为您提供有价值的信息,并激发您的思考。
或者,您有更好的建议欢迎在评论区留言。
-感谢您花时间阅读这篇博客-

来源:https://www.cnblogs.com/junsun-blogs-home/archive/2023/08/11/17622979.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具