WCF的异步方法为什么没有wcf生成代理类

WCF的异步方法为什么没有生成_百度知道
WCF的异步方法为什么没有生成
提问者采纳
自改写按照命名规则名前添加Begin、End组异步组即能识别我试
来自团队:
其他类似问题
为您推荐:
wcf的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁您所在的位置: &
WCF中的异步实现
WCF中的异步实现
对于WCF中通讯的双方来说,客户端可以异步的调用服务;服务端对服务也能以异步的方式实现。这就涉及到两个方面:WCF客户端异步调用服务;服务端的异步实现本节是Artech《WCF技术剖析(卷1)》一篇读书笔记。在文章中老A介绍了客户端如何以异步的方式消费WCF服务,以及服务的异步实现,个人对这几种方式做个总结。
1.WCF客户端异步调用服务
2.服务端的异步实现
WCF客户端异步调用服务主要通过生成异步的代理类,然后调用其中的异步方法来实现异步调用。
异步代理类的生成:
通过SvcUtil /async 直接生产异步代理;
通过添加应用的方式,点击&添加引用&的&高级&按钮,在弹出来的对话框中选择&生成异步&。如图:
498)this.width=498;' onmousewheel = 'javascript:return big(this)' alt="" src="/files/uploadimg/0210.jpg" />
生成的异步调用代理类部分借口:
[ponentModel.ponentModel.EditorBrowsableState.Advanced)] &public&System.IAsyncResult&BeginAdd(int&x,&int&y,&System.AsyncCallback&callback,&object&asyncState)&{ &return&base.Channel.BeginAdd(x,&y,&callback,&asyncState); &} &&&public&void&AddAsync(int&x,&int&y)&{ &this.AddAsync(x,&y,&null); &} &&public&void&AddAsync(int&x,&int&y,&object&userState)&{ &if&((this.onBeginAddDelegate&==&null))&{ &this.onBeginAddDelegate&=&new&BeginOperationDelegate(this.OnBeginAdd); &} &if&((this.onEndAddDelegate&==&null))&{ &this.onEndAddDelegate&=&new&EndOperationDelegate(this.OnEndAdd); &} &if&((this.onAddCompletedDelegate&==&null))&{ &this.onAddCompletedDelegate&=&new&System.Threading.SendOrPostCallback(this.OnAddCompleted); &} &base.InvokeAsync(this.onBeginAddDelegate,&new&object[]&{ &x, &y},&this.onEndAddDelegate,&this.onAddCompletedDelegate,&userState); &}&
1、客户端异步调用服务
客户端异步调用服务主要方式有几种:
1.1、直接调用异步方法:
在生成的代理类中,有BeginAdd\EndAdd等服务契约中定义的Add操作的异步实现。直接调用BeginAdd方法,实现客户端异步调用服务端方法。在调用BeginAdd方法后,可执行一些其他操作,这些操作与服务端Add调用并行执行,Add调用最终通过EndAdd方法得到。
测试代码如下:
客户端代码:
IAsyncResult&asyncResult&=&calculatorClient.BeginAdd(1,&for&(int&i&=&0;&i&&&10;&i++)& &{ &Console.WriteLine(i); &} &int&resul&=&calculatorClient.EndAdd(asyncResult); &Console.WriteLine(string.Format(&计算结果:{0}&,resul));&
服务端代码:
public&int&Add(int&x,&int&y)& &{ &for&(int&i&=&0;&i&&&20;&i++) &{ &Console.WriteLine(i); &} &Console.WriteLine(&开始计算...&); &return&x&+&y; &}&
服务端输出如下:
498)this.width=498;' onmousewheel = 'javascript:return big(this)' alt="" src="/files/uploadimg/0217.jpg" />
客户端输出如下:
498)this.width=498;' onmousewheel = 'javascript:return big(this)' alt="" src="/files/uploadimg/0218.jpg" />
这种方式使用了EndAdd方法,如果服务端没有执行完成,当前线程会被阻塞直到异步调用的服务完成后结束。如客户端代码保持不变,将服务实现改为如下:
for&(int&i&=&0;&i&&&20;&i++)& &{ &Console.WriteLine(i); &} &Thread.Sleep(5000); &Console.WriteLine(&开始计算...&); &return&x&+&y;&
如果在服务端让线程睡眠几秒,就可看到客户端会被阻塞:
1.2、通过回调的方式异步调用服务:
在生成的异步调用代理类中,还可以通过回调用服务:
IAsyncResult&asyncResult&=&calculatorClient.BeginAdd(1,&2, &delegate(IAsyncResult&asyncResult) &{ &int&[]&array&=&asyncResult.AsyncState&as&int&[]; &int&result=&calculatorClient.EndAdd(asyncResult1); &calculatorClient.close() &Console.WriteLine(string.Format(&{0}+{1}={2}&,&array[0],&array[1],&result)); &},&new&[]{1,2});&
这种方式是对服务的异步调用完成以后,自动调用回调来获取结果。
1.3、通过为异步操作注册事件
&calculatorClient.AddAsync(10,&36,&new[]&{&1000&}); &&calculatorClient.AddCompleted&+=&calculatorClient_AddC &Console.WriteLine(&服务调用完成...&); &Console.ReadKey(); &&privatestaticvoid&calculatorClient_AddCompleted(object&obj,&AddCompletedEventArgs&args) &{ &var&array&=&args.UserState&as&int[]; &int&result&=&args.R &Console.WriteLine(result); &}&
2、服务的异步实现:
将服务实现定义成异步的方式,需要将OperationContract的AsyncPattern设置为true;应用到BeginXX接口上,并且此操作的最后两个参数必须为AsyncCallback ,object;需要有一个EndXX(IAsyncResult asyncResult)的接口与异步调用的接口匹配。需要注意的是EndXX(IAsyncResult asyncResult)不能再次声明为契约接口,也就是不能再标记为OperationContract。
将服务定义为异步服务,契约定义如下 :
[OperationContract(AsyncPattern&=&true)]& &IAsyncResult&BeginCalculator& &(int&x,int&y&,AsyncCallback&asyncCallback,&object&state); &void&EndCalculator(IAsyncResult);&
然后在实现契约接口的服务中,将方法实现为异步的。
将契约接口声明为单向,也就是OneWay,这样客户端对此服务接口调用就是异步的。因为它无需等待服务端返回,客户端只需将消息发送到传输层就立即返回。
那能不能将将这种客户端对服务端的异步调用直接标记为单向的,那是不是可以不用生成异步代理类(即上述SvcUtil /Ayncs或者在添加引用时声明将代理类生成异步操作)?答案是否定的,因为OneWay要求方法的返回值为void,而异步的方法需要IAsyncResult最为返回值,这两者矛盾的。
原文链接:
【编辑推荐】
【责任编辑: TEL:(010)】
关于的更多文章
WCF是基于Windows平台下开发和部署服务的软件开发包(SDK)。WCF
所以姑娘,让我们做一枚花见花开的程序媛。
程序员的30岁,是个伤不起的现象。你不可能敲一辈子的
Hadoop Summit 2013 大会讲师 PPT 第二季重磅来袭!如
现在这天气到处都是高温,还是老老实实的呆在家里上网
程序设计实践并不只是写代码。程序员必须评论各种折衷方案,在许多可能性之中做出选择、排除错误、做测试和改进程序性能,还要维
51CTO旗下网站09.WCF异步调用模式_图文_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
09.WCF异步调用模式
||暂无简介
总评分0.0|
大小:1.80MB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢什么叫做异步回调?_百度知道
什么叫做异步回调?
异步回调就是发起请求后,不等待响应就去先干别的事相对于同步就是必须等到响应该请求后才能做别的事
其他类似问题
为您推荐:
AsynCallback现期待调事件才事件触发调用该callBack通调用该线程设置调线程线程
简单的说就是if (!IsPostBack)
ajax 不用刷新网页的情况下从服务器传递数据。
首先举个同步调用的例子:
比如你的程序调用了一个方法,这个方法要执行很长很长时间,而且这个时间都不确定,传统的办法就是“同步调用”,如下:
private int Func()
// 这个方法要执行很长时间,并且返回一个int的值。
private void A()
int n = Func();
textBox1.Text = n.ToString();
// 这里得到的n就是Func执行出来的结果,并且显示在textBox1中。
采用上述方法,可以叫做同步调用,很明显它有一个缺点:
Func方法执行的时间过长,程序会阻塞,并且无法继续执行其他的代码,给用户的体验就是整个程序都会僵着,打开任务管理器会提示该程序没有响应,用户以为程序死了,就会手动结束这个程序,
而异步调用就不一样,在调用完Func这个方法后,不必等待Func...
回调的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁WCF从理论到实践(11)-异步
本系列文章导航 WCF从理论到实践(1):揭开神秘面纱 WCF从理论到实践(2):决战紫禁之巅 WCF从理论到实践(3):八号当铺之黑色契约 WCF从理论到实践(4):路在何方 WCF从理论到实践(5):Binding细解 WCF从理论到实践(6):WCF架构 WCF从理论到实践(7):消息交换模
本系列文章导航WCF从理论到实践(1):揭开神秘面纱WCF从理论到实践(2):决战紫禁之巅WCF从理论到实践(3):八号当铺之黑色契约WCF从理论到实践(4):路在何方WCF从理论到实践(5):Binding细解WCF从理论到实践(6):WCF架构WCF从理论到实践(7):消息交换模式WCF从理论到实践(8):事件广播WCF从理论到实践(9):实例模式和对象生命周期WCF从理论到实践(10):异常处理WCF从理论到实践(11)-异步WCF从理论到实践(12):事务WCF从理论到实践(13):事务投票WCF从理论到实践(14):WCF解决方案模板WCF从理论到实践(15):响应变化WCF从理论到实践(16):操作重载(带视频+ppt+源码)WCF从理论到实践(17):OO大背离(带视频+ppt+源码)
通过阅读本文,您能了解以下知识
1) 如何在WCF中实现异步
2) 异步操作的优缺点及其应用场合
3) 总结对比各种异步操作的实现方式
4) 代码不骗人,实现一个WCF异步小范例
本文适合的读者
本文因为涉及一些常用的基础知识和开发技巧,需要对多线程等具有一定的认识,所以初学者可能不能立即掌握,本文适合WCF中级用户或有其他分布式技术开发经验的WCF初学者
如何在WCF中实现异步
在ARM(异步编程模型)中,我们经常看到BeingXXX(..),EndXXX(..)这样的函数定义,那和他们对应的同步方法还有XXX(..),比如FileStream对象,它既包括同步方式int Read(byte[] buffer,int offset,int count),还有IAsyState BeginRead(byte[] buffer,int offset,int count,IAsyCallback callback,Object asyState)和int EndRead(IAsyState ar)这样的异步方式,如果我们的WCF服务程序也和FileStream设计一样,那我们一些开发人员要跳楼了.本来一个业务方法的实现现在变为了3个,工作量增加了2倍.为何有这样的说法,因为这样的架构不是一个好架构,作为一个优秀的框架,WCF肯定不会犯如此低级的错误,异步与否本来应该是由客户端来决定的,所以我们的服务端实现无需关心异步与否.下面我们来看一下如何实现异步,WCF中实现异步是一件非常简单的事情,我们用svcutil来生成客户端代理代码的时候,只需添加 /async&便可以生成有异步功能的代理类了.而在IDE中,操作就更加简单,就是在添加ServiceReference的时候,选择高级选项,钩选Generate Asynchronus operations,如图:
生成异步操作的代理类下就会增加BeginXXX和EndXXX方法。比如我们示例项目中服务契约中有
[OperationContract]&
的操作方法,生成的代理类中对应其的异步方法为:
System.IAsyncResult&BeginGetData(&asyncState);&
string&EndGetData(System.IAsyncResult&result);&
异步操作的优缺点及其应用场合
在前面WCF从理论到实践:事件广播文章中,我曾经提到异步操作能提高系统的吞吐能力,老赵同志也曾针对我的说法写了篇正确使用异步操作来校正滥用异步的错误做法,那异步究竟有何优点值得我们使用?而又有什么缺点需要我们使用的时候小心呢?诚如老赵所说,异步并不一定能提高系统性能,甚至因为线程的创建,消亡,和切换会增加系统开销,但异步除了提高性能,还可以增强系统的健壮性。在过去,windows程序总是单线程的,在这样的系统中,如果出现了异常,系统就会 因此而崩溃,甚至连我们的操作系统也是单线程的,所以每次出现异常,我们的计算机用户都要不厌其烦强制关机,然后重启才能解决问题。加入多线程之后,当一个线程上的任务发生异常的时候,其他线程有能力不受影响,从此防止整个应用程序的崩溃。此外如果用户是在一个UI中操作某项耗时的操作,如果不使用异步,,那UI线程就会被阻塞,导致界面无法响应,用户就会很无助,,增加了异步,让复杂的任务在另外的线程中完成,就会有比较好的用户体验。而且异步并不是说对性能提高没有作用,CLR线程的创建,销毁,和线程上下文切换的确会有很大的开销,,比如每创建一个线程,都必须申请1MB的地址用于线程的用户模式,申请12KB左右的德地址用于线程的内核模式,而且还要求进程调用每个dll中的一个 固定的函数来通知所有的dll系统创建了一个新的线程,同样在销毁的时候,也要做类似的通知,上面这一切似乎都说明了异步操作对于性能的坏处,但事实并非完全如此,我们知道当前的处理器基本上都是双核,或者支持hyper-thread,一个线程的执行总会占用1个cpu逻辑核,如果我们的计算机是4核,8核,而我们不采用异步,那其实多核就没什么太大优势,因为总是1个核在工作,而另外的核却在休息,效率肯定低下,而此时用多线程,就可以充分使用计算机的处理器资源。同时对于一些有IO限制的操作而言,如读取磁盘文件,网络数据相关操作时,整个过程并不是完全靠运算,而是要通过磁盘驱动器或者网络驱动器来协助完成,比如读取磁盘中的一个文件,当应用程序的读取线程发出读请求的时候,该请求会被磁盘驱动器所排队处理,假如它是个很长的操作,那么该操作会在磁盘驱动器上排队或者执行很长时间,而这段时间读线程就处于阻塞的状态,这样就浪费了线程资源,正确的做法应该是线程将读请求发送到磁盘驱动器后马上返回,继续处理其他任务,而当磁盘驱动器操作完成的时候,由磁盘驱动器来通知或者由一个线程来轮询执行状态。这样就防止线程资源被浪费,从而提高系统性能。总结一下上面的说法,异步有三个优点:
1) 在I/O受限等情况下,异步能提高性能,并且能更加充分利用多核CPU的优点。
2) 异步能增强系统健壮性
3) 异步能改善用户体验
同时也有缺点,如下
1) 滥用异步,会影响性能
2) 增加编程难度
总结对比各种异步操作的实现方式
实现异步,主要包含以下几种方法
你最喜欢的

我要回帖

更多关于 wsdl 生成wcf代理类 的文章

 

随机推荐