关于C# 异步操作整理

  1. 按照个人的理解, 写一个接口用Task异步操作(态度:接受并且学习,您提出宝贵的经验与理解,我会认真学习):

  在主线程中调用异步方法,如果主线程依赖异步方法的返回值那么你一定会去等待子线程的操作时间,但主线程可以继续处理自己的业务,增加了线程的利用率也增加了时间的利用率。(就像人们常说的忙里偷闲一样)

    1.1如果一个项目 分层为:WebAPI(接口),Service(业务处理),Domain(基础操作),ORM。

WebAPI:处理, 接受请求,返回请求结果

Service :拼接操作+数据处理

Domain :基础业务 (增、删、改等)操作

ORM: dapper,EF,sqlSugar 等数据访问ORM 基本够用(封一下使用类)

    1.2分析:

  Service中 如果需要多次数据库操作时, 异步操作就会节省时间同时去请求数据库, 主线程不堵塞,可以1,2,3的发出请求操作,如果是同步,只能等待第一个出现结果,再去执行下一次操作。然后去等待他们的返回值,再去做一些数据处理加工。最终还是要去等待子的处理结果,假设他们都是相同方法,同步则需要消耗 *3的时间,异步则需要 <3的时间(理想状态,主线程也会节省部分时间) 

  2.以下就是一个小的DOME,并不是以上的结果,而是体现异步方法通道的重要性

  重点:保证异步方法之间调用通道的通畅

class Program
{
//Main方法
static void Main(string[] args)
{
Console.WriteLine(">>>>>>>>>>>>>>>>主线程启动");
Task<string> task = GetStringAsync1();
Console.WriteLine("<<<<<<<<<<<<<<<<主线程结束");
Console.WriteLine($"GetStringAsync1执行结果:{task.Result}");
} #region 异步方法
static async Task<string> GetStringAsync1()
{
Console.WriteLine(">>>>>>>>GetStringAsync1方法启动");
string str = await GetStringAsync2();
Console.WriteLine("<<<<<<<<GetStringAsync1方法结束");
return str;
}
static async Task<string> GetStringAsync2()
{
Console.WriteLine(">>>>>>>>GetStringAsync2方法启动");
string str = await GetStringFromTask();
Console.WriteLine("<<<<<<<<GetStringAsync2方法结束");
return str;
}
static Task<string> GetStringFromTask()
{
Console.WriteLine(">>>>GetStringFromTask方法启动");
Task<string> task = new Task<string>(() =>
{
Console.WriteLine(">>任务线程启动");
Thread.Sleep(1000);
Console.WriteLine("<<任务线程结束");
return "hello world";
});
task.Start();
Console.WriteLine("<<<<GetStringFromTask方法结束");
return task;
}
#endregion
}
  2.1结果:

    2.2分析:

  task.Result获取异步方法返回值 , await用于等待子线程结果,而主线程不会因为子线程开始而停止继续执行。

如果通道中出现 .result,则直接堵塞主线程。

  3.假设:把代码调整  调用多个异步方法

		//Main方法
static void Main(string[] args)
{
Console.WriteLine(">>>>>>>>>>>>>>>>主线程启动");
Task<string> task = GetStringAsync1();
Task<string> task1 = GetStringAsync1();
Task<string> task2 = GetStringAsync1();
Console.WriteLine("<<<<<<<<<<<<<<<<主线程结束");
Console.WriteLine($"GetStringAsync1执行结果:{task.Result}");
}
    3.1结果:

    3.2分析:
从整体运行时间上,就可以看出来不足3秒,也就2秒多一些,而且也可以看出 第二次调用第三次调用中等待1秒的操作,基本是同时执行完毕。

  4.总结一下,在偷时间,充分利用主线程等待与多个子线程之间互不干涉的同时执行的形式。

  注:本人也是查看许多大神的文章所理解整理的内容,如果有侵权请联系我(1054529695@qq.com),也欢迎大家查看。

关于C# 异步的更多相关文章

  1. 异步任务队列Celery在Django中的使用

    前段时间在Django Web平台开发中,碰到一些请求执行的任务时间较长(几分钟),为了加快用户的响应时间,因此决定采用异步任务的方式在后台执行这些任务.在同事的指引下接触了Celery这个异步任务队 ...

  2. C#异步编程(一)

    异步编程简介 前言 本人学习.Net两年有余,是第一次写博客,虽然写的很认真,当毕竟是第一次,肯定会有很多不足之处, 希望大家照顾照顾新人,有错误之处可以指出来,我会虚心接受的. 何谓异步 与同步相对 ...

  3. redux-amrc:用更少的代码发起异步 action

    很多人说 Redux 代码多,开发效率低.其实 Redux 是可以灵活使用以及拓展的,经过充分定制的 Redux 其实写不了几行代码.今天先介绍一个很好用的 Redux 拓展-- redux-amrc ...

  4. C#与C++的发展历程第三 - C#5.0异步编程巅峰

    系列文章目录 1. C#与C++的发展历程第一 - 由C#3.0起 2. C#与C++的发展历程第二 - C#4.0再接再厉 3. C#与C++的发展历程第三 - C#5.0异步编程的巅峰 C#5.0 ...

  5. 关于如何提高Web服务端并发效率的异步编程技术

    最近我研究技术的一个重点是java的多线程开发,在我早期学习java的时候,很多书上把java的多线程开发标榜为简单易用,这个简单易用是以C语言作为参照的,不过我也没有使用过C语言开发过多线程,我只知 ...

  6. 异步编程 In .NET

    概述 在之前写的一篇关于async和await的前世今生的文章之后,大家似乎在async和await提高网站处理能力方面还有一些疑问,博客园本身也做了不少的尝试.今天我们再来回答一下这个问题,同时我们 ...

  7. ajax异步请求

    做前端开发的朋友对于ajax异步更新一定印象深刻,作为刚入坑的小白,今天就和大家一起聊聊关于ajax异步请求的那点事.既然是ajax就少不了jQuery的知识,推荐大家访问www.w3school.c ...

  8. 探索ASP.NET MVC5系列之~~~2.视图篇(上)---包含XSS防御和异步分部视图的处理

    其实任何资料里面的任何知识点都无所谓,都是不重要的,重要的是学习方法,自行摸索的过程(不妥之处欢迎指正) 汇总:http://www.cnblogs.com/dunitian/p/4822808.ht ...

  9. C#异步编程(二)

    async和await结构 序 前篇博客异步编程系列(一) 已经介绍了何谓异步编程,这篇主要介绍怎么实现异步编程,主要通过C#5.0引入的async/await来实现. BeginInvoke和End ...

  10. [.NET] 利用 async & await 的异步编程

    利用 async & await 的异步编程 [博主]反骨仔 [出处]http://www.cnblogs.com/liqingwen/p/5922573.html  目录 异步编程的简介 异 ...

随机推荐

  1. RadioButton分组的实现

    原文:RadioButton分组的实现     XAML如下 <StackPanel> <RadioButton GroupName="colorgrp"> ...

  2. NET SignalR2

    .NET SignalR2持久连接层解析   越是到年底越是感觉浑身无力,看着啥也不想动,只期盼着年终奖的到来以此来给自己打一针强心剂.估摸着大多数人都跟我一样犯着这样浑身无力的病,感觉今年算是没挣到 ...

  3. 并发-Java并发编程基础

    Java并发编程基础 并发 在计算机科学中,并发是指将一个程序,算法划分为若干个逻辑组成部分,这些部分可以以任何顺序进行执行,但与最终顺序执行的结果一致.并发可以在多核操作系统上显著的提高程序运行速度 ...

  4. 编写可移植C/C++程序的要点(12条)

    1.分层设计,隔离平台相关的代码.就像可测试性一样,可移植性也要从设计抓起.一般来说,最上层和最下层都不具有良好的可移植性.最上层是GUI,大多数GUI都不是跨平台的,如Win32 SDK和MFC.最 ...

  5. Ubuntu 官方推荐源列表

    如何使用Ubuntu Night Ubuntu Night(  http://ubuntu9.com ) 的Top mirror功能根据当前的网络情况和源健康状况不断地进行更新当前可用的源的信息,包括 ...

  6. CountDownLatch和CyclicBarrier 专题

    4.Runnable接口和Callable接口的区别 有点深的问题了,也看出一个Java程序员学习知识的广度. Runnable接口中的run()方法的返回值是void,它做的事情只是纯粹地去执行ru ...

  7. C/C++使用openssl进行摘要和加密解密(md5, sha256, des, rsa)

    openssl里面有很多用于摘要哈希.加密解密的算法,方便集成于工程项目,被广泛应用于网络报文中的安全传输和认证.下面以md5,sha256,des,rsa几个典型的api简单使用作为例子. 算法介绍 ...

  8. c# 安装windows服务

    C# windows服务: 第一种 :通过cmd命令安装.卸载.启动和停止Windows Service(InstallUtil.exe) 步骤: 1.运行--〉cmd:打开cmd命令框 2.在命令行 ...

  9. ELINK离线编程器版本说明

    ELINK离线编程器版本详情,ELinkPROG版本与固件版本须匹配使用! 编程器支持芯片详细列表参见  https://www.cnblogs.com/raswin/p/9303300.html

  10. 详解 Java 8 HashMap 实现原理

    HashMap 是 Java 开发过程中常用的工具类之一,也是面试过程中常问的内容,此篇文件通过作者自己的理解和网上众多资料对其进行一个解析.作者本地的 JDK 版本为 64 位的 1.8.0_171 ...