--WCF同步和异步调用实例 /******************************************************************************** *主题:WCF同步和异步调用实例 *说明:本文是个人学习的一些笔记和个人愚见 * 有很多地方你可能觉得有异议,欢迎一起讨论 *作者:Stephenzhou(阿蒙) *日期: 2012.07.31 *Mail:[email protected] *另外:转载请著名出处。 **********************************************************************************/
异步调用(asynchronous call
操作系统发展到今天已经十分精巧,线程就是其中一个杰作。操作系统把 CPU处理时间划分成许多短暂时间片,在时间 T1执行一个线程的指令,到时间 T2又执行下一线程的指令,各线程轮流执行,结果好象是所有线程在并肩前进。这样,编程时可以创建多个线程,在同一期间执行,各线程可以“并行”完成不同的任务。
在单线程方式下,计算机是一台严格意义上的冯·诺依曼式机器,一段代码调用另一段代码时,只能采用同步调用,必须等待这段代码执行完返回结果后,调用方才能继续往下执行。
有了多线程的支持,可以采用异步调用,调用方和被调方可以属于两个不同的线程,调用方启动被调方线程后,不等对方返回结果就继续执行后续代码。
比如:比如FileStream对象的Read方法
WCF异步的二种方式
WCF可以由二种方式生成客户端异步调用的代理类:
1、用svcutil生成异步功能的代理类
2、修改接口定义异步方法
实现异步,主要包含以下几种方法
1) 使用专用线程,方法为:
System.Threading.ThreadStartts = newSystem.Threading.ThreadStart(void(object state) target);
System.Threading.Threadth = newSystem.Threading.Thread(ts);
ts.Start();
2) 使用线程池中的线程
线程是一种比较宝贵的资源,所以使用的时候就要加倍珍惜,线程池中线程在使用完成之后并不是马上销毁,而是回到池中等待下一次的使用,这样就可以较少线程创建的消耗。使用方法如下:
ThreadPool.QueueUserWorkItem(WaitCallback callback)
需要注意的是此种方法使用的均为后台线程
3) 使用异步编程模型
这种方法是MS推荐的使用方法,该模型普遍格式为:
BeginXXX(…IAsyCallBackcallback,objectasyState);
EndXXX(IAsyStatear);
4) 使用BackgroundWorker
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; namespace Client { public partial class Form1 : Form { public Form1() { InitializeComponent(); } //同步调用 private void button1_Click(object sender, EventArgs e) { ServiceReference1.Service1Client client = new Client.ServiceReference1.Service1Client(); MessageBox.Show(client.ServerTime()); } //异步调用 private void button2_Click(object sender, EventArgs e) { ServiceReference1.Service1Client Client = new Client.ServiceReference1.Service1Client(); Client.ServerTimeCompleted += new EventHandler<Client.ServiceReference1.ServerTimeCompletedEventArgs>(ClientComplete); Client.ServerTimeAsync(); } void ClientComplete(object sender, Client.ServiceReference1.ServerTimeCompletedEventArgs e) { MessageBox.Show(e.Result); } } }
*作者:Stephenzhou(阿蒙)
*日期: 2012.08.03
*Mail:[email protected]
*另外:转载请著名出处。
*博客地址:http://blog.csdn.net/szstephenzhou