同步方法

  1. Console.WriteLine($"****************Sync Start {Thread.CurrentThread.ManagedThreadId.ToString("")} {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}***************");
  2. Action<string> action = this.DoSomething;
  3. for (int i = ; i < ; i++)
  4. {
  5. string name = string.Format($"Sync_{i}");
  6. action.Invoke(name); //等价 方法直接执行 this.DoSomething(name);
  7. }
  8. Console.WriteLine($"****************Sync End {Thread.CurrentThread.ManagedThreadId.ToString("")} {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}***************");

异步方法

  1. Console.WriteLine($"****************Async Start {Thread.CurrentThread.ManagedThreadId.ToString("")} {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}***************");
  2. for (int i = ; i < ; i++)
  3. {
  4. var name = $"Async_{i}";
  5. action.BeginInvoke(name,null,null);
  6. }
  7. Console.WriteLine($"****************Async End {Thread.CurrentThread.ManagedThreadId.ToString("")} {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}***************");
  1. /// <summary>
  2. /// 一个比较耗时耗资源的私有方法
  3. /// </summary>
  4. private void DoSomething(string name)
  5. {
  6. Console.WriteLine($"****************{name} Start {Thread.CurrentThread.ManagedThreadId.ToString("")} {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}***************");
  7. long lResult = ;
  8. for (int i = ; i < 1_000_000; i++)
  9. {
  10. lResult += i;
  11. }
  12. Thread.Sleep();
  13. Console.WriteLine($"****************{name} Start {Thread.CurrentThread.ManagedThreadId.ToString("")} {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}***************");
  14. }

运行上面的代码,我们发现几个问题:

1、同步方法卡界面:主线程(UI线程)忙于计算,无暇他顾 ;异步多线程方法不卡界面:主线程闲置,计算任务交给子线程完成

2、同步方法慢,只有一个线程计算;

异步多线程方法快,因为5个线程并发计算   差不多5倍,也不到5倍,CPU密集型计算(资源受限)

多线程其实是资源换性能,1 资源不是无限的  2 资源调度损耗

3、同步方法有序进行;

异步多线程无序

启动无序:线程资源是向操作系统申请的,由操作系统的调度策略决定,所以启动顺序随机

执行时间无序:同一个任务同一个线程,执行时间也不确定,CPU分片

结束无序:以上相加,结束也无序

AsyncCallback 异步回调:将后续动作通过回调参数传递进去,子线程完成计算后,去调用这个回调委托

AsyncState 用户定义对象:可以作为回调的参数

  1. Console.WriteLine($"****************Async Start {Thread.CurrentThread.ManagedThreadId.ToString("")} {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}***************");
  2. AsyncCallback callback = ar => Console.WriteLine($"{nameof(AsyncCallback)} 是否完成:{ar.IsCompleted} 用户定义对象:{ar.AsyncState} {Thread.CurrentThread.ManagedThreadId.ToString("")}");
  3. for (int i = ; i < ; i++)
  4. {
  5. var name = $"Async_{i}";
  6. action.BeginInvoke(name, callback, i);
  7. }
  8. Console.WriteLine($"****************Async End {Thread.CurrentThread.ManagedThreadId.ToString("")} {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}***************");

IAsyncResult 对异步调用操作的描述

IsCompleted 判定异步任务是否完成

while (!asyncResult.IsCompleted) //if(!asyncResult.IsCompleted)
{
      // Do SomeThing
}

WaitOne 等待,即时等待  限时等待

asyncResult.AsyncWaitHandle.WaitOne();//直接等待任务完成
asyncResult.AsyncWaitHandle.WaitOne(-1);//一直等待任务完成
asyncResult.AsyncWaitHandle.WaitOne(1000);//最多等待1000ms,超时就不等了

EndInvoke 即时等待,而且可以获取委托的返回值 一个异步操作只能End一次

  1. Func<int, int> func = Sum;
  2. func.BeginInvoke(, ar => {
  3. Console.WriteLine($"线程ID:{ Thread.CurrentThread.ManagedThreadId.ToString("")} 计算结果:{func.EndInvoke(ar)}");
  4. }, null);
  5.  
  6. IAsyncResult asyncResult = func.BeginInvoke(,ar =>
  7. {
  8. //int iEndResultIn = func.EndInvoke(ar);
  9. }, null);
  10. int iEndResult = func.EndInvoke(asyncResult);

EndInvoke 可以写在BeginInvoke里也可以写在外面 但只能写一次 否则会报错

微软文档:

IAsyncResult:https://docs.microsoft.com/zh-cn/dotnet/api/system.iasyncresult?view=netframework-4.8

AsyncCallback:https://docs.microsoft.com/zh-cn/dotnet/api/system.asynccallback?view=netframework-4.8

C# sync/async 同步/异步的更多相关文章

  1. jquery ajax属性async(同步异步)示例

    在jquery的ajax中如果我们希望实现同步或者异步我们可以直接设置async发生为真或假即可true false,下面举几个jquery ajax同步和异步实例 例1.jquery+ajax/&q ...

  2. async同步异步

    1.同步:var async = require("async"); async.series([step1, step2, step3],function(err, values ...

  3. ASP.NET sync over async(异步中同步,什么鬼?)

    async/await 是我们在 ASP.NET 应用程序中,写异步代码最常用的两个关键字,使用它俩,我们不需要考虑太多背后的东西,比如异步的原理等等,如果你的 ASP.NET 应用程序是异步到底的, ...

  4. 将 async/await 异步代码转换为安全的不会死锁的同步代码

    在 async/await 异步模型(即 TAP Task-based Asynchronous Pattern)出现以前,有大量的同步代码存在于代码库中,以至于这些代码全部迁移到 async/awa ...

  5. C# 同步 异步 回调 状态机 async await Demo

    源码 https://gitee.com/s0611163/AsyncAwaitDemo 为什么会研究这个? 我们项目的客户端和服务端通信用的是WCF,我就想,能不能用异步的方式调用WCF服务呢?或者 ...

  6. JS中的同步异步编程

    首先我们先看看同步与异步的定义,及浏览器的执行机制,方便我们更好地理解同步异步编程. 浏览器是多线程的,JS是单线程的(浏览器只分配一个线程来执行JS)   进程大线程小:一个进程中包含多个线程,例如 ...

  7. .Net Core WebAPI 基于Task的同步&异步编程快速入门

    .Net Core WebAPI 基于Task的同步&异步编程快速入门 Task.Result async & await 总结 并行任务(Task)以及基于Task的异步编程(asy ...

  8. AJAX请求详解 同步异步 GET和POST

    AJAX请求详解 同步异步 GET和POST 上一篇博文(http://www.cnblogs.com/mengdd/p/4191941.html)介绍了AJAX的概念和基本使用,附有一个小例子,下面 ...

  9. GCD的同步异步串行并行、NSOperation和NSOperationQueue一级用dispatch_once实现单例

    转:http://www.tuicool.com/articles/NVVnMn (1)GCD实现的同步异步.串行并行. ——同步sync应用场景:用户登录,利用阻塞 ——串行异步应用场景:下载等耗时 ...

随机推荐

  1. 关于layer的基本所有的事件全部失效问题

    只要在页面中,要是存在id="undefined", layer的基本所有的事件全部失效. <input type="radio" id="un ...

  2. 基于servlet+filter+反射模拟实现天猫首页的后端

    前言:为了深入web原理,本项目没有使用框架,主要描述了从请求到页面展现的思路,详情请见文末的具体项目 一.为什么要用filter?直接servlet实现不就行了 因为天猫这样的项目需要很多servl ...

  3. .Neter所应该彻底了解的委托

    本文将通过引出几个问题来,并且通过例子来剖析C#中的委托以及用法,做抛砖引玉的作用 对于委托我发现大部分人都有以下问题,或者可能在面试中遇过这样的: 委托是不是相当于C/C++的函数指针? 委托究竟是 ...

  4. SpringBoot 发送邮件功能实现

    背景 有个小伙伴问我你以前发邮件功能怎么弄的.然后我就给他找了个demo,正好在此也写一下,分享给大家. 理清痛点 发送邮件,大家可以想一下,坑的地方在哪? 我觉得是三个吧. 第一:邮件白名单问题. ...

  5. 转:关于JAVA项目中CLASSPATH路径详解

    在dos下编译Java程序,就要用到classpath这个概念,尤其是在没有设置环境变量的时候.classpath就是存放.class等编译后文件的路径. javac:如果当前你要编译的Java文件中 ...

  6. 掘金转载-手写一个Promise

    目录 一 什么是Promise ? 二 Promises/A+ 规范 2.1 术语 2.2 基本要求 2.2.1. Promise的状态 2.2.2. Then 方法 2.3 简易版实践 2.4 进一 ...

  7. [TimLinux] Python学习内容框架

    以下内容主体来自<Python学习手册第四版>,大致整理出的方向 1. 第一部分:使用入门 介绍Python语法之前,先对Python的的各个方面进行一个比较宽广的介绍,包含对Python ...

  8. 最全的linux基础命令

    第1章 linux命令 1.1 线上查询及帮助命令 help命令*** help前面接你要查询的命令:例如ls [root@server02 ~]# ls --help 用法:ls [选项]... [ ...

  9. ARTS-S k8s常用命令

    本地访问minikube的docker eval $(minikube docker-env) 删除statefulset kubectl delete statefulset web --casca ...

  10. Spring-security-oAuth2分享

    Spring-security-oAuth2分享 oAuth2简介 OAuth 2.0是用于授权的行业标准协议.OAuth 2.0致力于简化客户端开发人员的工作,同时为Web应用程序,桌面应用程序,移 ...