同步与异步区别之我见(一)
在Silverlight中我们经常要涉及到异步操作,而在WinForm、ASP.NET中我们经常涉及到的是同步操作。从ASP.NET转到Silverlight方向,在数据操作方面觉得很不习惯。有时被异步和同步弄得头昏眼花。为了弄清楚他们的区别。我自己做了一些测试,将一点体会记录下来,供以后参考学习!
(一)添加如下WCF服务BSService:
(1)接口IBSService
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.Text; namespace SLAnsycTest.Web { // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“IBSService”。 [ServiceContract] public interface IBSService { [OperationContract] string DoRice(); [OperationContract] string DoVegetables(); [OperationContract] string DoEating(); } }
(2)BSService.svc.cs
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.Text; //添加命名空间 using System.Threading; using System.ServiceModel.Activation; namespace SLAnsycTest.Web { // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码、svc 和配置文件中的类名“BSService”。 [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] public class BSService : IBSService { public string DoRice() { Thread.Sleep(5000); return "[" + DateTime.Now.ToString() + "] " + "饭做完了,花了我50分钟"; } public string DoVegetables() { Thread.Sleep(6000); return "[" + DateTime.Now.ToString() + "] " + "菜做完了,花了我60分钟"; } public string DoEating() { Thread.Sleep(3000); return "[" + DateTime.Now.ToString() + "] " + "吃饱了,花了我30分钟"; } } }
(二)添加WindowsFormSyncTest项目,用于测试同步操作。
(1)Form1.cs代码如下
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; //添加命名空间 using WindowsFormSyncTest.ServiceReference1; namespace WindowsFormSyncTest { public partial class Form1 : Form { BSServiceClient client = new BSServiceClient(); public Form1() { InitializeComponent(); this.Load += new EventHandler(Form1_Load); } void Form1_Load(object sender, EventArgs e) { //我们在WinForm中调用Wcf。我们可以看到在WinForm中敲打client.DoR的时候可以看到智能提示中出现DoRice和DoRiceAsync //DoRice()方法是同步方法,而DoRiceAsync()这个两个方法是WCF跟我们自动创建的。 //下面我们用同步方法做测试,完成 做饭--》做菜--》开饭的流程顺序(这个顺序是先做饭,在做菜,饭菜都做完才可以开饭) //可以看到如下图所示各项工作完成情况时间图: //从图中,我们可以看见 //做饭过程:从2010-10-11 09:34:24到2010-10-11 09:34:29 总共花了50分钟(我们这里把5秒当做50分钟是为了符合常理又可以方便调用立即返回方便观察,下面下同) //做菜过程:从2010-10-11 09:34:29到2010-10-11 09:34:35 总共花了60分钟 //开饭过程:从2010-10-11 09:34:35到2010-10-11 09:34:38 总共花了30分钟 //整个T(做饭、做菜、开饭)=T(做饭)+T(做菜)+T(开饭)=50+60+30=140分钟。 //由此可见整个过程要花140分钟才能完成,视乎时间很长。有的人视乎发现可以有更高效的办法,就是在做饭的时候同时做菜,那样等菜做完了就可以吃饭,因为菜做完了的话,饭也已经熟了,就可以开饭了,对这种做饭和做菜同时进行的方案就是我们下面要讲到的异步方案。 this.textBox1.Text += "[" + DateTime.Now.ToString() + "]" + "发出[开始做饭]命令" + Environment.NewLine; this.textBox1.Text+= client.DoRice()+Environment.NewLine; this.textBox1.Text += Environment.NewLine; this.textBox1.Text += "[" + DateTime.Now.ToString() + "]" + "发出[开始做菜]命令" + Environment.NewLine; this.textBox1.Text+=client.DoVegetables()+Environment.NewLine; this.textBox1.Text += Environment.NewLine; this.textBox1.Text += "[" + DateTime.Now.ToString() + "]" + "发出[开始开饭]命令" + Environment.NewLine; this.textBox1.Text += client.DoEating()+Environment.NewLine; } } }
(2)同步操作运行截图为:
(三)添加WindowsFormsAnsycTest项目,用于测试异步操作
(1)Form1.cs代码如下
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; //添加命名空间 using WindowsFormsAnsycTest.ServiceReference1; namespace WindowsFormsAnsycTest { public partial class Form1 : Form { BSServiceClient client = new BSServiceClient(); public Form1() { InitializeComponent(); this.Load += new EventHandler(Form1_Load); } //使用异步方案:就是我们在做饭的同时做菜(这个逻辑是符合我们我们的高效的生活的),等菜做完了就可以开饭了。 //下面我们用同步方法做测试:做饭做菜同时进行------》(如果菜做完了)开饭 //可以看到如下图所示各项工作完成情况时间图: //从图中,我们可以看见 //做饭过程:从2010-10-11 10:13:45到2010-10-11 10:13:50 总共花了50分钟(我们这里把5秒当做50分钟是为了符合常理又可以方便调用立即返回方便观察,下面下同) //做菜过程:从2010-10-11 09:34:45到2010-10-11 09:34:51 总共花了60分钟 //开饭过程:从2010-10-11 09:34:51到2010-10-11 09:34:54 总共花了30分钟 //整个T(做饭、做菜、开饭)=T(做菜)+T(开饭)=60+30=90分钟。 //可以异步方案相对于同步方案节省了 T(节省时间)=T(同步)-T(异步)=140-90=60分钟,可见异步方案更具有高效性。 //总结: //通过上面可以看出来, //同步:所谓同步就是 任务A--->任务B---->任务C ,只有任务A做完了才可以做任务B,任务B做完了才可做任务C,整个过程所花的时间各任务所花时间总和 //异步:所谓异步就是 在同一段时间内能做n个任务,整个过程的任务所花的时间综合是最长任务所花的时间 //由此可见异步操作可以大大提高操作效率。节约时间成本。 void Form1_Load(object sender, EventArgs e) { this.textBox1.Text += "[" + DateTime.Now.ToString() + "]" + "发出[开始做饭]命令" + Environment.NewLine; client.DoRiceAsync(); client.DoRiceCompleted+=new EventHandler<DoRiceCompletedEventArgs>(client_DoRiceCompleted); this.textBox1.Text += "[" + DateTime.Now.ToString() + "]" + "发出[开始做菜]命令" + Environment.NewLine; client.DoVegetablesAsync(); client.DoVegetablesCompleted+=new EventHandler<DoVegetablesCompletedEventArgs>(client_DoVegetablesCompleted); } void client_DoRiceCompleted(object sender, DoRiceCompletedEventArgs e) { if (e.Error==null) { this.textBox1.Text += Environment.NewLine; this.textBox1.Text += e.Result + Environment.NewLine; } else { } } void client_DoVegetablesCompleted(object sender, DoVegetablesCompletedEventArgs e) { if (e.Error == null) { this.textBox1.Text += Environment.NewLine; this.textBox1.Text += e.Result + Environment.NewLine; this.textBox1.Text += "[" + DateTime.Now.ToString() + "] " + "菜和饭都做完了,开饭了!!!" + Environment.NewLine; this.textBox1.Text += "[" + DateTime.Now.ToString() + "]" + "发出[开始开饭]命令" + Environment.NewLine; this.textBox1.Text += Environment.NewLine; //开饭可以用同步方法和异步方法,所用的时间是一样的。 //client.DoEatingAsync(); //client.DoEatingCompleted += new EventHandler<DoEatingCompletedEventArgs>(client_DoEatingCompleted); this.textBox1.Text += client.DoEating() + Environment.NewLine; } else { } } void client_DoEatingCompleted(object sender, DoEatingCompletedEventArgs e) { if (e.Error == null) { this.textBox1.Text += Environment.NewLine; this.textBox1.Text += e.Result + Environment.NewLine; } else { } } } }
(2)异步测试运行截图如下:
总结
通过上面可以看出来,
同步:所谓同步就是 任务A--->任务B---->任务C ,只有任务A做完了才可以做任务B,任务B做完了才可做任务C,整个过程所花的时间各任务所花时间总和
异步:所谓异步就是 在同一段时间内能做n个任务,整个过程的任务所花的时间综合是最长任务所花的时间
由此可见异步操作可以大大提高操作效率。节约时间成本。
同步与异步区别之我见(一)相关推荐
- ajax 同步和异步区别?
ajax 同步和异步区别? 我们在使用 ajax 一般都会使用异步处理. 异步处理呢就是我们通过事件触发到 ajax,请求服务器,在这个期间无论服务器有没有响应,客户端的其他代码一样可以运行. 同步处 ...
- ajax 同步和异步区别
ajax ajax 同步和异步区别? 我们在使用 ajax 一般都会使用异步处理. 异步处理呢就是我们通过事件触发到 ajax,请求服务器,在这个期间无论服务器有没有响应,客户端的其他代码一样可以运行 ...
- ajax中异步属性,ajax中的async属性值之同步和异步及同步和异步区别
jquery中ajax方法有个属性async用于控制同步和异步,默认是true,即ajax请求默认是异步请求,有时项目中会用到AJAX同步.这个同步的意思是当JS代码加载到当前AJAX的时候会把页面里 ...
- ajax同步和异步区别
同步和异步的区别,ajax的编程步骤解:同步是指一个线程要等待上一个线程执行完才能开始执行,同步可以看做是一个单线程操作,只要客户端请求了,在服务器没有反馈信息之前是一个线程阻塞状态.异步是一个线程在 ...
- java 同步与异步区别_同步和异步有何异同,在什么情况下分别使用它们?
2015-05-12 06:30:01 阅读( 4 ) 通俗版:举个例子:普通B/S模式(同步)AJAX技术(异步) 同步:提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器 ...
- ajax同步、异步区别及应用
之前面试曾被问到异步与同步的应用场景,只是说了一部分,没理解透. 其实平时使用的ajax大多数是异步的,即ajax请求与下面执行的代码没有先后顺序(之前自己一直没有注意到). 有时会用到同步,比如当执 ...
- java登录时启动后台异步线程_JAVA多线程的同步和 异步
原标题:JAVA多线程的同步和 异步 1.多线程和异步操作的异同 多线程和异步操作两者都可以达到避免调用线程阻塞的目的,从而提高软件的可响应性.甚至有些时候我们就认为多线程和异步操作是等同的概念.但是 ...
- java同步和异步机制_JAVA学习过程中的知识——java多线程的同步和异步
1.多线程和异步操作的异同 多线程和异步操作两者都可以达到避免调用线程阻塞的目的,从而提高软件的可响应性.甚至有些时候我们就认为多线程和异步操作是等同的概念.但是,多线程和异步操作还是有一些区别的.而 ...
- java 高效的多线程同步_java多线程的同步和异步
java多线程的同步和异步 Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言.Java 技术具有卓越的通用性.高效性.平台移植性和安全性,广泛应用于PC.数据中心.游戏控制台.科学超级计算 ...
最新文章
- user is not in the sudoers file.
- 面对这些情况,要勇于说“不​”
- java script 6 折线_Java Script学习 6(转)
- Tomcat系统架构
- 将js文件编译成动态链接库(dll)文件
- Maven项目下update maven后Eclipse报错:java.lang.ClassNotFoundException: ContextLoaderL
- java上传png_java上传png图片出现红色背景
- oracle+mybatis查询遇到CHAR类型字段
- JS针对图片加载及404处理
- C# 给picturebox添加滚动条
- 通过运算符重载实现复数加减
- 立体匹配算法(局部立体匹配 、全局立体匹配 、深度学习立体匹配 )
- 【转载】Oracle关于expdp、impdp以及rman介绍
- 什么是serialVersionUID?serialVersionUID详解
- python强行终止程序_python终止程序的方法
- Java Attach机制
- 仿微信九宫格群聊view
- 腾讯云cos对象存储服务文件上传api就是一个大坑
- SSD固态硬盘:掉盘的四大类原因
- --仿蓝色理想网站的导航菜单--
热门文章
- 将数字转换成科学计数法
- C/C++语言二维数组的传参方法总结
- 已解决ModuleNotFoundError: No module named ‘Workbook‘
- 处理textarea的空格和换行
- C++ operator 简单使用
- 从一块内存开始,带你了解企业级虚拟化(二)
- 快速排序算法原理 Quicksort —— 图解(精讲) JAVA
- SQL server 清空数据库所有表
- Redis 设计与实现 5:压缩列表 ziplist
- [__ob__: Observer]