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. HDU 4162 Shape Number(字符串,最小表示法)

    HDU 4162 题意: 给一个数字串(length <= 300,000),数字由0~7构成,求出一阶差分码,然后输出与该差分码循环同构的最小字典序差分码. 思路: 第一步是将差分码求出:s[ ...

  2. Javascript--cookie创建与查看

    创建cookie 以下代码将创建一个cookie,该cookie名称为UserName,值为Paul,过期时间为7天后(2015年6月29日) <span style="font-si ...

  3. EularProject 43: 带条件约束的排列组合挑选问题

    Sub-string divisibility Problem 43 The number, 1406357289, is a 0 to 9 pandigital number because it ...

  4. JAVA入门[18]-JdbcTemplate简单实例

    一.关于JdbcTemplate JdbcTemplate是最基本的Spring JDBC模板,这个模板支持简单的JDBC数据库访问功能以及基于索引参数的查询. Spring数据访问模板:在数据库操作 ...

  5. mongodb 3.4 集群搭建:分片+副本集

    mongodb是最常用的nodql数据库,在数据库排名中已经上升到了前六.这篇文章介绍如何搭建高可用的mongodb(分片+副本)集群. 在搭建集群之前,需要首先了解几个概念:路由,分片.副本集.配置 ...

  6. JavaSe: String的编译期优化

    Java的编译期优化 因为工作的原因,经常会在没有源码的情况下,对一些产品的代码进行阅读.有时在解决Bug时,在运行环境下会直接去看class文件的字节码,来确定运行中版本是否正确的. 在看字节码时, ...

  7. SpringCloud四:hystrix-propagation

    注:pom.xml 及配置文件配置与上篇相同 package com.itmuch.cloud.controller; import org.springframework.beans.factory ...

  8. JAVA Socket编程(二)之TCP通信

    基于TCP(面向连接)的socket编程,分为客户端和服务器端. 客户端的流程如下: (1)创建套接字(socket) (2)向服务器发出连接请求(connect) (3)和服务器端进行通信(send ...

  9. 如何在markdown中插入表情

    Markdown是很好用的呀,个人灰常的喜欢,也是灰常漂亮的,但是如何在写文章的时候插入表情呢,下面给出一部分代码

  10. JaveScript流程控制(JS知识点归纳四)

    01 流程控制 顺序结构: 程序的默认执行方式 条件判断语句:也称之为分支结构,选择结构:如果程序要执行的代码出现了多种情况需要使用 循环结构:当代码需要多次重复执行多次时,使用 02 条件判断语句 ...