C#中的异步

C#5.0版本发布有一个"主题那就是异步编程。

我们先创建一个windowForm窗体,实现下面效果,然后我们通过简单的案例对比同步和异步;

首先我们编写一个耗时方法:

  /// <summary>
         /// 耗时方法
         /// </summary>
         /// <param name="name"></param>
         private void DoSomething(string name)
         {
             Stopwatch watch = new Stopwatch();
             watch.Start();
             Console.WriteLine("这里是name={0},当前线程ID={1}",name,Thread.CurrentThread.ManagedThreadId);
             ;
             ;i<;i++)
             {
                 IResult += ;
             }
             Thread.Sleep();
             watch.Stop();
             Console.WriteLine("这里是name ={0},当前线程ID ={1},计算结果是{2},耗时{3}",name,Thread.CurrentThread.ManagedThreadId,IResult,watch.ElapsedMilliseconds);
         }

这个耗时方法就是为了执行耗费的时间可明显感知,

然后我们写一个同步方法,执行这个DoSomething()

  private void btnTongbu_Click(object sender, EventArgs e)
         {
             Console.WriteLine("*********************同步执行************************");
             ;i<;i++)
             {
                 string name = string.Format("同步_Click_{0}",i);
                 DoSomething(name);
             }
             Console.WriteLine("*********************同步结束************************");
             Console.WriteLine("\n\n");
         }

打印出来计算结果

我们可以从当前的线程ID看出他只有一个线程,并且是顺序执行

我们在写一个异步调用

 private void btnAsync_Click(object sender, EventArgs e)
         {
             Console.WriteLine("*********************异步执行************************");
             ; i < ; i++)
             {
                 string name = string.Format("同步_Click_{0}", i);
                 DoSomethingHandler method = DoSomething;
                 method.BeginInvoke(name, null, null);
             }
             Console.WriteLine("*********************异步结束************************");
             Console.WriteLine("\n\n");
         }

执行之后我们对比一下执行结果:

对比之后发现了什么?

首先他的执行和结束风格符在一块了,这是怎么回事呢,这个是因为异步执行的时候线程不同,执行的顺序发生了改变。他的name序号是无序的,线程id也不相同。我们在来看看同样执行的cpu占用率

这个是同步的CPU占用截图,会发现有小峰值,但是基本平稳。这个是异步的CPU占用的截图,出现了明显峰值。

BeginInvoke 方法用于启动异步调用。它与您需要异步执行的方法具有相同的参数,只不过还有两个额外的参数

原来我们是这样使用的 method.BeginInvoke(name, null, null);

我们来看看他的其他两个参数

  private void btnAsyncSr_Click(object sender, EventArgs e)
         {
             Console.WriteLine("*********************异步深入执行************************");
             );
             DoSomethingHandler method = DoSomething;

             AsyncCallback callback = t => Console.WriteLine("这里是AsyncCallback,当前线程ID={0},AsyncState={1}",Thread.CurrentThread.ManagedThreadId,t.AsyncState);
             method.BeginInvoke(name,callback,"设定状态1");
             //method.BeginInvoke(name, null, null);

             IAsyncResult reuslt=method.BeginInvoke(name,t=> Console.WriteLine("这里是IAsyncResult,当前线程ID={0},AsyncState={1}", Thread.CurrentThread.ManagedThreadId, t.AsyncState),"设定状态2");

             Console.WriteLine("*********************异步深入结束************************");
             Console.WriteLine("\n\n");
         }

IAsyncResult 接口存储一个异步操作的状态信息,并提供一个同步对象,以使线程能够在操作完成时发出信号。

AsyncCallback委托表示异步操作完成时调用的回调方法

我们在来看看异步等待

reuslt.AsyncWaitHandle.WaitOne(-1);//一直等待到结束

他是等待一个线程结束后在执行下一线程

while(!reuslt.IsCompleted)
{
Thread.Sleep(100);
Console.WriteLine("请继续等待……");
}

method.EndInvoke(reuslt);

这是三种异步等待的的方法和结果。我们来总结一下啊

/*
*总结
* 1、同步方法会卡住界面,异步方法不卡界面;原因:异步启动了子线程来执行任务,主线程得到释放
* 2、同步方法会慢,异步方法比同步快;原因:异步启动了多个线程执行任务,占用了更多资源
* 3、异步是无序的;原因:线程的启动和执行是有操作系统决定的,是无序的。
*/

C#中的异步学习的更多相关文章

  1. (转)Servlet 3.0/3.1 中的异步处理学习

    转:https://www.cnblogs.com/davenkin/p/async-servlet.html 在Servlet 3.0之前,Servlet采用Thread-Per-Request的方 ...

  2. ASP.NET MVC EF 中使用异步控制器

    最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精   为什么使用异步操作/线程池 ASP.NET MVC ...

  3. Android中AsyncTask异步

    今天我们学习了 AsyncTack, 这是一个异步任务. 那么这个异步任务可以干什么呢? 因为只有UI线程,即主线程可以对控件进行更新操作.好处是保证UI稳定性,避免多线程对UI同时操作. 同时要把耗 ...

  4. [译]Python中的异步IO:一个完整的演练

    原文:Async IO in Python: A Complete Walkthrough 原文作者: Brad Solomon 原文发布时间:2019年1月16日 翻译:Tacey Wong 翻译时 ...

  5. 【JS】336- 拆解 JavaScript 中的异步模式

    点击上方"前端自习课"关注,学习起来~ JavaScript 中有很多种异步编程的方式.callback.promise.generator.async await 甚至 RxJS ...

  6. 【JS】285- 拆解 JavaScript 中的异步模式

    JavaScript 中有很多种异步编程的方式.callback.promise.generator.async await 甚至 RxJS.我最初接触不同的异步模式时,曾想当然的觉得 promise ...

  7. [技术翻译]在现代JavaScript中编写异步任务

    本周再来翻译一些技术文章,本次预计翻译三篇文章如下: 04.[译]使用Nuxt生成静态网站(Generate Static Websites with Nuxt) 05.[译]Web网页内容是如何影响 ...

  8. Netty 中的异步编程 Future 和 Promise

    Netty 中大量 I/O 操作都是异步执行,本篇博文来聊聊 Netty 中的异步编程. Java Future 提供的异步模型 JDK 5 引入了 Future 模式.Future 接口是 Java ...

  9. Combine 框架,从0到1 —— 4.在 Combine 中执行异步代码

    本文首发于 Ficow Shen's Blog,原文地址: Combine 框架,从0到1 -- 4.在 Combine 中执行异步代码. 内容概览 前言 用 Future 取代回调闭包 用输出类型( ...

随机推荐

  1. 做ppt经常使用站点

    推荐一下做PPT经常使用的站点 一.字体 http://font.chinaz.com 二.ppt模板:演界网 三.图标 http://www.easyicon.net/

  2. get和post提交数据的差别

    form表单提交,默认method = "get",所以你在提交数据的时候,最好将此參数指定为method = "post",否则你在提交大数据的时候,可能会出 ...

  3. JavaScript面向对象编程(9)高速构建继承关系之整合原型链

    前面我们铺垫了非常多细节.是为了让大家更加明晰prototype的使用细节: 如今能够将前面的知识整合起来,写一个函数用于高速构建基于原型链的继承关系了: function extend(Child, ...

  4. [Sqoop]利用sqoop对mysql运行DML操作

    业务背景 利用sqoop对mysql进行查询.加入.删除等操作. 业务实现 select操作: sqoop eval \ --connect jdbc:mysql://127.0.0.1:3306/m ...

  5. 【Sqlsever系列】日期和时间

    1   概述 本文将集合MSDN简要概述Sqlserver中日期和时间函数. 2   具体内容 2.1  date and time data types 2.2  日期和时间功能 3   参考文献 ...

  6. 从0开始做垂直O2O个性化推荐-以58到家美甲为例

    从0开始做垂直O2O个性化推荐 上次以58转转为例,介绍了如何从0开始如何做互联网推荐产品(回复"推荐"阅读),58转转的宝贝为闲置物品,品类多种多样,要做统一的宝贝画像比较难,而 ...

  7. 微服务架构之RPC-client序列化细节

    通过上篇文章的介绍,知道了要实施微服务,首先要搞定RPC框架,RPC框架的职责要向[调用方]和[服务提供方]屏蔽各种复杂性: (1)让调用方感觉就像调用本地函数一样 (2)让服务提供方感觉就像实现一个 ...

  8. 七、Spring Boot Servlet 使用

    Web开发使用 Controller 基本上可以完成大部分需求,但是我们还可能会用到 Servlet.Filter.Listener.Interceptor 等等. 当使用spring-Boot时,嵌 ...

  9. 自学Zabbix3.8.3-可视化Visualisation-Screens

    自学Zabbix3.8.3-可视化Visualisation-Screens 在Zabbix屏幕上,您可以将来自不同来源的信息分组,以快速浏览单个屏幕.构建屏幕非常简单直观.本质上,屏幕是一个表.您可 ...

  10. 自学Python5.2-类、模块、包

    类.模块.包  一.类 类的概念在许多语言中出现,很容易理解.它将数据和操作进行封装,以便将来的复用. 二.模块module 通常模块为一个文件,直接使用import来导入就好了.可以作为module ...