C#中的异步学习
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#中的异步学习的更多相关文章
- (转)Servlet 3.0/3.1 中的异步处理学习
转:https://www.cnblogs.com/davenkin/p/async-servlet.html 在Servlet 3.0之前,Servlet采用Thread-Per-Request的方 ...
- ASP.NET MVC EF 中使用异步控制器
最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精 为什么使用异步操作/线程池 ASP.NET MVC ...
- Android中AsyncTask异步
今天我们学习了 AsyncTack, 这是一个异步任务. 那么这个异步任务可以干什么呢? 因为只有UI线程,即主线程可以对控件进行更新操作.好处是保证UI稳定性,避免多线程对UI同时操作. 同时要把耗 ...
- [译]Python中的异步IO:一个完整的演练
原文:Async IO in Python: A Complete Walkthrough 原文作者: Brad Solomon 原文发布时间:2019年1月16日 翻译:Tacey Wong 翻译时 ...
- 【JS】336- 拆解 JavaScript 中的异步模式
点击上方"前端自习课"关注,学习起来~ JavaScript 中有很多种异步编程的方式.callback.promise.generator.async await 甚至 RxJS ...
- 【JS】285- 拆解 JavaScript 中的异步模式
JavaScript 中有很多种异步编程的方式.callback.promise.generator.async await 甚至 RxJS.我最初接触不同的异步模式时,曾想当然的觉得 promise ...
- [技术翻译]在现代JavaScript中编写异步任务
本周再来翻译一些技术文章,本次预计翻译三篇文章如下: 04.[译]使用Nuxt生成静态网站(Generate Static Websites with Nuxt) 05.[译]Web网页内容是如何影响 ...
- Netty 中的异步编程 Future 和 Promise
Netty 中大量 I/O 操作都是异步执行,本篇博文来聊聊 Netty 中的异步编程. Java Future 提供的异步模型 JDK 5 引入了 Future 模式.Future 接口是 Java ...
- Combine 框架,从0到1 —— 4.在 Combine 中执行异步代码
本文首发于 Ficow Shen's Blog,原文地址: Combine 框架,从0到1 -- 4.在 Combine 中执行异步代码. 内容概览 前言 用 Future 取代回调闭包 用输出类型( ...
随机推荐
- HDU 4162 Shape Number(字符串,最小表示法)
HDU 4162 题意: 给一个数字串(length <= 300,000),数字由0~7构成,求出一阶差分码,然后输出与该差分码循环同构的最小字典序差分码. 思路: 第一步是将差分码求出:s[ ...
- Javascript--cookie创建与查看
创建cookie 以下代码将创建一个cookie,该cookie名称为UserName,值为Paul,过期时间为7天后(2015年6月29日) <span style="font-si ...
- EularProject 43: 带条件约束的排列组合挑选问题
Sub-string divisibility Problem 43 The number, 1406357289, is a 0 to 9 pandigital number because it ...
- JAVA入门[18]-JdbcTemplate简单实例
一.关于JdbcTemplate JdbcTemplate是最基本的Spring JDBC模板,这个模板支持简单的JDBC数据库访问功能以及基于索引参数的查询. Spring数据访问模板:在数据库操作 ...
- mongodb 3.4 集群搭建:分片+副本集
mongodb是最常用的nodql数据库,在数据库排名中已经上升到了前六.这篇文章介绍如何搭建高可用的mongodb(分片+副本)集群. 在搭建集群之前,需要首先了解几个概念:路由,分片.副本集.配置 ...
- JavaSe: String的编译期优化
Java的编译期优化 因为工作的原因,经常会在没有源码的情况下,对一些产品的代码进行阅读.有时在解决Bug时,在运行环境下会直接去看class文件的字节码,来确定运行中版本是否正确的. 在看字节码时, ...
- SpringCloud四:hystrix-propagation
注:pom.xml 及配置文件配置与上篇相同 package com.itmuch.cloud.controller; import org.springframework.beans.factory ...
- JAVA Socket编程(二)之TCP通信
基于TCP(面向连接)的socket编程,分为客户端和服务器端. 客户端的流程如下: (1)创建套接字(socket) (2)向服务器发出连接请求(connect) (3)和服务器端进行通信(send ...
- 如何在markdown中插入表情
Markdown是很好用的呀,个人灰常的喜欢,也是灰常漂亮的,但是如何在写文章的时候插入表情呢,下面给出一部分代码
- JaveScript流程控制(JS知识点归纳四)
01 流程控制 顺序结构: 程序的默认执行方式 条件判断语句:也称之为分支结构,选择结构:如果程序要执行的代码出现了多种情况需要使用 循环结构:当代码需要多次重复执行多次时,使用 02 条件判断语句 ...