异步能在一定场景中带性能的飞跃,同步调用性能,也以带来时间的节省。

先看一下被调用的api:

using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;namespace WebAPI.Controllers
{[ApiController][Route("[controller]")]public class HomeController : ControllerBase{private readonly ILogger<HomeController> _logger;public HomeController(ILogger<HomeController> logger){_logger = logger;}[HttpGet("/api001")]public async Task<IActionResult> GetAPI001(){_logger.LogInformation("GetAPI001");await Task.Delay(1000);return new JsonResult(new { result = true, data = "api001 返回成功" });}[HttpGet("/api002")]public async Task<IActionResult> GetAPI002(){_logger.LogInformation("GetAPI002");await Task.Delay(1000);if (DateTime.Now.Second % 2 == 0){throw new Exception("api002异常");}return new JsonResult(new { result = true, data = "api002 返回成功" });}[HttpGet("/api003")]public async Task<IActionResult> GetAPI003(){_logger.LogInformation("GetAPI003");await Task.Delay(1000);return new JsonResult(new { result = true, data = "api003 返回成功" });}}
}

调用时反序列化的实体类

    class ResponseResult<T>{public bool Result { get; set; }public string Message { get; set; }public T Data { get; set; }}

三个api的调用方法

private static async Task<string> GetAPI001(HttpClient httpClient)
{var content = await httpClient.GetStringAsync("http://localhost:5000/api001");var result = JsonSerializer.Deserialize<ResponseResult<string>>(content, new JsonSerializerOptions { PropertyNameCaseInsensitive = true });if (result.Result){return result.Data;}else{return result.Message;}
}
private static async Task<string> GetAPI002(HttpClient httpClient)
{var content = await httpClient.GetStringAsync("http://localhost:5000/api002");var result = JsonSerializer.Deserialize<ResponseResult<string>>(content, new JsonSerializerOptions { PropertyNameCaseInsensitive = true });if (result.Result){return result.Data;}else{return result.Message;}
}
private static async Task<string> GetAPI003(HttpClient httpClient)
{var content = await httpClient.GetStringAsync("http://localhost:5000/api003");var result = JsonSerializer.Deserialize<ResponseResult<string>>(content, new JsonSerializerOptions { PropertyNameCaseInsensitive = true });if (result.Result){return result.Data;}else{return result.Message;}
}

同步的调用方式

static async Task SyncCall()
{using var httpClient = new HttpClient();try{var result1 = await GetAPI001(httpClient);WriteLine(result1);}catch (Exception exc){WriteLine(exc.Message);}try{var result2 = await GetAPI002(httpClient);Console.WriteLine(result2);}catch (Exception exc){WriteLine(exc.Message);}try{var result3 = await GetAPI003(httpClient);Console.WriteLine(result3);}catch (Exception exc){WriteLine(exc.Message);}
}

调用方式

static async Task Main(string[] args)
{while (true){WriteLine("回车开始执行");ReadLine();var stopwatch = Stopwatch.StartNew();await SyncCall();WriteLine($"用时{stopwatch.ElapsedMilliseconds}ms");}
}

同步的调用,运行三次调用是三次的时间,3202ms,如果有异常不干扰其他api调用。

static async Task AsyncCall()
{using var httpClient = new HttpClient();var allTasks = Task.WhenAll(GetAPI001(httpClient), GetAPI002(httpClient), GetAPI003(httpClient));try{var results = await allTasks;foreach (var result in results){Console.WriteLine(result);}}catch (Exception exc){Console.WriteLine($"捕捉到的异常:{exc.Message}");}if (allTasks.Exception != null){Console.WriteLine($"AllTasks异常:{ allTasks.Exception.Message}");}
}

同步调用成功时间是1156ms,时间缩短了,但三个api调用,如果有异常,则全军覆没。

先择适合的方式,打造更优的应用。

考虑用Task.WhenAll相关推荐

  1. 异步/等待-什么时候返回Task vs void?

    本文翻译自:async/await - when to return a Task vs void? Under what scenarios would one want to use 在什么情况下 ...

  2. Asp.Net Core 轻松学-多线程之Task快速上手

    Asp.Net Core 轻松学-多线程之Task快速上手 原文:Asp.Net Core 轻松学-多线程之Task快速上手 前言     Task是从 .NET Framework 4 开始引入的一 ...

  3. Task和async/await详解

    一.什么是异步 同步和异步主要用于修饰方法.当一个方法被调用时,调用者需要等待该方法执行完毕并返回才能继续执行,我们称这个方法是同步方法:当一个方法被调用时立即返回,并获取一个线程执行该方法内部的业务 ...

  4. c#中Task线程的用法

    1.Task的优势 ThreadPool相比Thread来说具备了很多优势,但是ThreadPool却又存在一些使用上的不方便.比如: ◆ ThreadPool不支持线程的取消.完成.失败通知等交互性 ...

  5. NET问答: 多个 await 和 Task.WaitAll 是等价的吗?

    咨询区 vidalsasoon: 我有下面两个方法: MethodA: 使用多个 await 方式 public async Task<IHttpActionResult> MethodA ...

  6. C#多线程和异步(二)——Task和async/await详解

    一.什么是异步 同步和异步主要用于修饰方法.当一个方法被调用时,调用者需要等待该方法执行完毕并返回才能继续执行,我们称这个方法是同步方法:当一个方法被调用时立即返回,并获取一个线程执行该方法内部的业务 ...

  7. 【转】Task和async/await详解

    一.什么是异步 同步和异步主要用于修饰方法.当一个方法被调用时,调用者需要等待该方法执行完毕并返回才能继续执行,我们称这个方法是同步方法:当一个方法被调用时立即返回,并获取一个线程执行该方法内部的业务 ...

  8. 多线程之任务: Task 基础, 多任务并行执行, 并行运算(Parallel)

    Task - 基于线程池的任务(在 System.Threading.Tasks 命名空间下) 多 Task 的并行执行 Parallel - 并行计算(在 System.Threading.Task ...

  9. c# task添加顺序_关于c#:Task和async等待所需的指导

    本问题已经有最佳答案,请猛点这里访问. 在浏览了许多文章和视频后,我仍然对异步编程有疑问.我正在一个项目中,在服务层中,我已将所有方法创建为异步方法.所有返回Task < T >或Task ...

最新文章

  1. Keras TensorFlow教程:使用自己的数据集进行训练
  2. SQL基础操作_4_表的插入、更新、删除、合并操作
  3. MySql安装及Navicat连接(解决Starting the server失败;mysql输入密码登录报错1045(28000),不输入密码却能登录;Navicat连接报错2059)
  4. jclouds的命令行界面
  5. 电脑服务器系统被管理员停用,Win7系统任务管理器已被系统管理员停用怎么办?...
  6. UVA495 Fibonacci Freeze【大数+万进制】
  7. 机器学习面试-Keras/tensorflow
  8. aGlass学习笔记 1
  9. MCU升级文件HEX、BIN、S19格式概述
  10. 板邓:php+mayql分页原理及案例
  11. Vue电影网站构建实战教程
  12. 抽象类和接口的异同点
  13. sql导出的身份证后几位是000
  14. css中translation,css3 translate属性
  15. Echarts中DataView显示Excel表格
  16. 供应商质量工程师(SQE)是做什么的?
  17. 【windows11】win11 简单配置及快捷键
  18. 64位FME Server 与32位FME Desktop协同处理MDB格式数据
  19. Matlab 增加配色方案
  20. Altium Designer 18 入门教程简化版----原理图和PCB--适合新手

热门文章

  1. 本地无法启动MySQL服务,报的错误:1067,进程意外终止---解决
  2. (转)WebSphere的web工程中怎么获取数据源
  3. [ci]jenkins server启动,通过jnlp的方式启动slave(容器模式)
  4. 自己封装一个弹框插件
  5. 正则表达式(括号)、[中括号]、{大括号}的区别
  6. mysql通过data目录恢复数据库
  7. Linux下Tomcat设置自动启动
  8. 如何衡量两个词的相关度
  9. 用SharpZipLib来压缩和解压文件 --zt
  10. 如何发现假库存照片(并将合适的人归于属性)