在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个任务,整个过程的任务所花的时间综合是最长任务所花的时间
        由此可见异步操作可以大大提高操作效率。节约时间成本。

同步与异步区别之我见(一)相关推荐

  1. ajax 同步和异步区别?

    ajax 同步和异步区别? 我们在使用 ajax 一般都会使用异步处理. 异步处理呢就是我们通过事件触发到 ajax,请求服务器,在这个期间无论服务器有没有响应,客户端的其他代码一样可以运行. 同步处 ...

  2. ajax 同步和异步区别

    ajax ajax 同步和异步区别? 我们在使用 ajax 一般都会使用异步处理. 异步处理呢就是我们通过事件触发到 ajax,请求服务器,在这个期间无论服务器有没有响应,客户端的其他代码一样可以运行 ...

  3. ajax中异步属性,ajax中的async属性值之同步和异步及同步和异步区别

    jquery中ajax方法有个属性async用于控制同步和异步,默认是true,即ajax请求默认是异步请求,有时项目中会用到AJAX同步.这个同步的意思是当JS代码加载到当前AJAX的时候会把页面里 ...

  4. ajax同步和异步区别

    同步和异步的区别,ajax的编程步骤解:同步是指一个线程要等待上一个线程执行完才能开始执行,同步可以看做是一个单线程操作,只要客户端请求了,在服务器没有反馈信息之前是一个线程阻塞状态.异步是一个线程在 ...

  5. java 同步与异步区别_同步和异步有何异同,在什么情况下分别使用它们?

    2015-05-12 06:30:01 阅读( 4 ) 通俗版:举个例子:普通B/S模式(同步)AJAX技术(异步) 同步:提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器 ...

  6. ajax同步、异步区别及应用

    之前面试曾被问到异步与同步的应用场景,只是说了一部分,没理解透. 其实平时使用的ajax大多数是异步的,即ajax请求与下面执行的代码没有先后顺序(之前自己一直没有注意到). 有时会用到同步,比如当执 ...

  7. java登录时启动后台异步线程_JAVA多线程的同步和 异步

    原标题:JAVA多线程的同步和 异步 1.多线程和异步操作的异同 多线程和异步操作两者都可以达到避免调用线程阻塞的目的,从而提高软件的可响应性.甚至有些时候我们就认为多线程和异步操作是等同的概念.但是 ...

  8. java同步和异步机制_JAVA学习过程中的知识——java多线程的同步和异步

    1.多线程和异步操作的异同 多线程和异步操作两者都可以达到避免调用线程阻塞的目的,从而提高软件的可响应性.甚至有些时候我们就认为多线程和异步操作是等同的概念.但是,多线程和异步操作还是有一些区别的.而 ...

  9. java 高效的多线程同步_java多线程的同步和异步

    java多线程的同步和异步 Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言.Java 技术具有卓越的通用性.高效性.平台移植性和安全性,广泛应用于PC.数据中心.游戏控制台.科学超级计算 ...

最新文章

  1. user is not in the sudoers file.
  2. 面对这些情况,要勇于说“不​”
  3. java script 6 折线_Java Script学习 6(转)
  4. Tomcat系统架构
  5. 将js文件编译成动态链接库(dll)文件
  6. Maven项目下update maven后Eclipse报错:java.lang.ClassNotFoundException: ContextLoaderL
  7. java上传png_java上传png图片出现红色背景
  8. oracle+mybatis查询遇到CHAR类型字段
  9. JS针对图片加载及404处理
  10. C# 给picturebox添加滚动条
  11. 通过运算符重载实现复数加减
  12. 立体匹配算法(局部立体匹配 、全局立体匹配 、深度学习立体匹配 )
  13. 【转载】Oracle关于expdp、impdp以及rman介绍
  14. 什么是serialVersionUID?serialVersionUID详解
  15. python强行终止程序_python终止程序的方法
  16. Java Attach机制
  17. 仿微信九宫格群聊view
  18. 腾讯云cos对象存储服务文件上传api就是一个大坑
  19. SSD固态硬盘:掉盘的四大类原因
  20. --仿蓝色理想网站的导航菜单--

热门文章

  1. 将数字转换成科学计数法
  2. C/C++语言二维数组的传参方法总结
  3. 已解决ModuleNotFoundError: No module named ‘Workbook‘
  4. 处理textarea的空格和换行
  5. C++ operator 简单使用
  6. 从一块内存开始,带你了解企业级虚拟化(二)
  7. 快速排序算法原理 Quicksort —— 图解(精讲) JAVA
  8. SQL server 清空数据库所有表
  9. Redis 设计与实现 5:压缩列表 ziplist
  10. [__ob__: Observer]