|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
你觉得数据库怎么样?WCF客户端不克不及用在Using语句块中,由于它大概会抛出不成预知的非常。即便你捕捉了非常,仍有大概一向坚持毗连。让我们来看看构成这一成绩的汗青缘故原由,并提出几个弥补措施。
在.NET中,资本办理的基本就是IDisposable和Using语句块。除CLR对象,.NET中统统对象均利用这些工具举行办理。因而,我们必要晓得为什么微软关于WCF框架的资本办理云云束手无策。
WCF客户真个主要成绩是Close/Dispose办法会抛出非常。这与框架计划指南和IDisposable规约南辕北辙,从而招致Dispose办法能够在Finally语句块中被不平安的挪用。
更糟的是,只需不挪用Abort,Close/Dispose办法就会一向坚持毗连。太多的毗连翻开就会带来功能的成绩,使用程序也会变得不敷不乱。
在旧事组中,有关此成绩的会商能够追溯到2006年,BrianMcNamara先容了这一计划缺点的幕后故事。ICommunicationObject(它是ServiceHost,ClientBase,IChannel,IChannelFactory与IChannelListener终极承继的对象)老是具有封闭对象的两个办法:(a)Close,(b)Abort。依照字面的了解,假如但愿自动封闭对象,则挪用Close;若要强迫封闭则挪用Abort。
因而,Close()办法会吸收一个Timeout参数,并包含一个异步版本(由于它大概堵塞线程),并且Close()还会抛出非常。Close抛出的非常为CommunicationException(CommunicationObjectFaultedException是其子类)与TimeoutException。
相反,Abort()其实不会堵塞线程(也不会抛出任何非常),因而没有Timeout值,也其实不包括异步版本。
这两个观点从最后的Indigo一向相沿至今[译注:所谓至今是指Brian宣布帖子的工夫2006年10月25日]。就今朝而言统统一般。
最后的界说为ICommunicationObject:IDisposalbe。作为一个标志接口,我们以为它能够用于关照用户在大概的时分马上开释对象。但是成绩却相继而来。
从Beta1版本入手下手,我们修正了Dispose(),让其同等于Abort()办法。一部分缘故原由是Dispose()应当完成最最少的需要的对象清算事情。在Beta1中,这大概算得上是我们的头号贫苦了。用户能够将它们的通道(channel)对象放在using()语句块中,缓存中任多么待被掏出的动静都大概会丧失。事件没法提交,会话大概失掉告诉收到(ACKed)的动静等。
鉴于用户的反应,在Beta2中我们又修正了完成,让Dispose()近似即是Close()。我们晓得,非常的抛出是成绩之地点(部分缘故原由在这篇帖子中已申明),因而我们试图让Dispose变得加倍“伶俐”。那就是说,假如以后并不是Opened形态,就会在外部挪用Abort()。这仍旧存在一系列成绩,最次要的是你没法从牢靠性角度揣度体系。Dispose仍旧会抛出非常,但并不是老是会关照你某些事变产生毛病。终极,我们决意将IDisposable从ICommunicationObject中移走。经由几番狡辩,IDisposable在ServiceHost和ClientBase中被保存了下来,由于从实际上讲,关于多半用户而言Dispose抛出非常仍旧是能够承受的,他们更倾向于利用using()的便当性,具有该标志接口就能够更实时地扫除对象。你大概主意(我们的一部分隔发职员抱有一样的立场):应当将它从这两个类中移走,但是好也罢歹也罢,我们毕竟作出了选择。关于这个成绩,你永久都不成能告竣分歧,因而我们在SDK样例中给出了最好理论,那就是遵守try{Close}/catch{Abort}范式。 弥补措施
SteveSmith提出了CloseConnection扩大办法[译注:原文并没有给出CloseConnection扩大办法的帖子,你能够会见IDisposable与WCF]。在Finally语句块中能够挪用该办法,而不是挪用Close,它封装了Close/Abort逻辑。
旧事组的发帖人bog1978倡议利用C#lambda以撑持创立相似Using的布局。办法吸收一个新的客户端对象,和一个匿名办法,该办法持有的代码与一般利用using语句块包括的代码完整不异。
最初,另有一个弥补措施是ErwynVanDerMeer界说的WCF服务代办署理帮助类。用户能够创立它,而不是一般的代办署理类,它能够改正在封闭毗连时呈现的成绩。一旦创立,它就会主动构建实践的代办署理,然后经由过程只读属性表露它。
检察英文原文:TheProblemswithWCFandtheUsingBlock
有时也搞不懂应该学那种;主要看你以后去的那个公司是使用哪种了。就像王千祥的课上说的:企业应用现在主要就三层(其实也差不多就是MVC):表示层(主要使用html写的,很简单)、业务逻辑层(主要就是应用服务器的)。最后就是数据层(其实就是学习数据库) |
|