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. 一起talk C栗子吧(第一百二十六回:C语言实例--statickeyword)

    各位看官们,大家好,上一回中咱们说的内置宏的样例.这一回咱们说的样例是:static关键字. 闲话休提.言归正转. 让我们一起talk C栗子吧! 看官们,C语言提供了static关键字.它常常出如今 ...

  2. 基于Gulp + Browserify构建es6环境下的自动化前端项目

    随着React.Angular2.Redux等前沿的前端框架越来越流行,使用webpack.gulp等工具构建前端自动化项目也随之变得越来越重要.鉴于目前业界普遍更流行使用webpack来构建es6( ...

  3. bandit_pass

    boJ9jbbUNNfktd78OOpsqOltutMc3MY1CV1DtqXWVFXTvM2F0k09SHz0YwRINYA9UmHadQclWmgdLOKQ3YNgjWxGoRMb5luKpIwr ...

  4. Bandit Wargame Level12 Writeup

    Level Goal The password for the next level is stored in the file data.txt, which is a hexdump of a f ...

  5. springboot学习笔记-4 整合Druid数据源和使用@Cache简化redis配置

    一.整合Druid数据源 Druid是一个关系型数据库连接池,是阿里巴巴的一个开源项目,Druid在监控,可扩展性,稳定性和性能方面具有比较明显的优势.通过Druid提供的监控功能,可以实时观察数据库 ...

  6. mysql连接错误问题

    ERROR 1130: Host '192.168.1.3' is not allowed to connect to this MySQL server 解决方法:1. 改表法.可能是你的帐号不允许 ...

  7. mac下通过mdfind命令搜索文件

    mdfind命令就是Spotlight功能的终端界面,这意味着如果Spotlight被禁用,mdfind命令也将无法工作.mdfind命令非常迅速.高效.最基本的使用方法是: mdfind -name ...

  8. 《大型网站技术架构:核心原理与案例分析》【PDF】下载

    <大型网站技术架构:核心原理与案例分析>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230062557 内容简介 本书通过梳理大型网站 ...

  9. DataBase MongoDB高级知识-易扩展

    MongoDB高级知识-易扩展 应用程序数据集的大小正在以不可思议的速度增长.随着可用宽带的增长和存储器价格的下跌,即使是一个小规模的应用程序,需要存储的数据也可能大的惊人,甚至超出了很多数据库的处理 ...

  10. Android LayoutInflator 解析

    一.实际使用场景引入: 在ListView的Adapter的getView方法中基本都会出现,使用inflate方法去加载一个布局,用于ListView的每个Item的布局.  同样,在使用ViewP ...