2009-09-04 134 views
0

今天我有一个WCF问题,尽管它也可能与.NET中的其他网络模型有关。WCF:DuplexSessionChannel,异步操作和异常

我有一个公开发送(消息)OperationContract,这是OneWay = true的WCF服务。现在这个服务有一个回调通道来将消息返回给客户端。

无论如何,我想(成功)从我的客户端异步调用此发送方法。在DuplexSessionChannel上,我调用BeginSend(Message,OnSendComplete,null),并且我有一个在DuplexSessionChannel上调用EndSend(asyncResult)的OnSendComplete(IAsyncResult)方法。

该服务有一个CallbackContract并使用相同的BeginSend()/ EndSend()模式发送回客户端,这是在我用OperationContext.Current.GetCallbackChannel获得的callBack通道上调用的。

从服务回调通道接收消息时,其DuplexSessionChannel上的客户端调用BeginReceive()/ EndReceive()。

即使事情正常,我不明白END <Operation>()方法实际上做了什么,这是我需要向我解释的。

我问,因为我在Service中调用EndSend()时偶尔发生异常(发送回客户端)抱怨集合已被修改(我知道这个异常意味着什么,但不知道它为什么是发生或确切地...)。我正在使用PollingDuplexHttpBinding和Silverlight客户端。

我不是WCF的专家,但不要阻挡细节,我需要知识。到目前为止,我在职业生涯中的其他异步操作之前已经看到了这些开始/结束模式,但从来没有真正理解发生了什么。

在此先感谢。

回答

1

这听起来像你的问题是关于开始/结束APM(异步编程模型)。简言之,APM采用类

R Foo(A a); // R is some result type, A is some argument type 

同步方法和把它分成异步BeginFoo和EndFoo方法。当操作正在进行一些可能长时间运行的真正异步的系统操作(例如与网络交谈)时(至少与其他功能相比,例如与网络交谈可能需要几百毫秒或更多),主要优势才会发生。该模式为您提供了一种方法来告诉系统启动操作,然后在操作结果准备就绪时再给您回电。这种模式的优点是,当这个调用未决时(也就是说,例如,您可以拥有数千个待处理的网络读取/写入,而不需要数千个线程,万智牌,线程昂贵),则不必阻塞托管线程。因此,'BeginFoo'是你如何说'用这些参数启动方法',然后当你被回调(作为结果已经准备就绪的通知)时,'EndFoo'是你如何得到结果。在一般情况下,如果'Foo'可能抛出一个特定的异常,那么这个异常可能来自'Begin'调用或'End'调用,你必须准备好在两个地方处理它。

在发送类似Send()的情况下(它可能会返回void?我忘记了),这有点令人讨厌/怪异,因为它是单向的,你只是想“开火而忘记”。但是例外情况仍然可能发生(例如,我尝试发送,但有人拔掉了我的网线),因此这可能会产生异常......并且给定Begin/End APM,这种异常可能来自EndSend调用。实际上,异常是调用Send的一种“结果”,所以调用EndSend提供了一种方法,让系统在您调用BeginSend之后向您发出异常以说出事情出错。

+0

在WCF中,IDuplexSessionChannel.BeginSend和EndSend具有以下签名: IAsyncResult BeginSend(Message,AsyncCallback,object) void EndSend(IAsyncResult); 我从传递给BeginSend的AsyncCallback委托调用的回调方法内部调用EndSend。鉴于EndSend()返回无效,我仍然不明白它是什么。我看到它的“结果”来自BeginSends AsyncCallback。我也不明白为什么BeginSend返回IAsyncResult,当它也由BeginSend AsyncCallback异步返回时。 – MrLane 2009-09-09 01:30:07

+0

阅读Brians后发布几个月后,我发布了这个问题,这种模式更加清晰。 Juval Lowery的编程WCF书也很好地解释了这一点。我仍然不知道异常的原因,但它已被淘汰,因为我不再调用EndSend(),因为我意识到无论如何都没有返回任何结果。我不知道这是否是好的做法(也许我可能会错过异常细节),但是这本书似乎暗示它可以被省略,并且因为删除东西已经好很多。 – MrLane 2010-02-02 04:28:50