我是WCF的新手。最初,我创建了一个WCF服务,并使用生成的客户端代理来使用来自客户端的服务。因此,每当我在服务上执行某些操作时,所有按顺序执行的操作都会同步调用操作。我将并发模式更改为多个,但操作仍然是同步进行的。然后我为我的操作生成了异步方法,并使用了开始/结束模式,因此我想“释放”通道并让操作并行/异步地增加我的应用程序的吞吐量。
然后我使用ChannelFactory
创建一个频道并执行操作,因为客户端和服务器可以共享合同(同一个项目)。但IClientChannel
仅提供BeginOpen/EndOpen/BeignClose/EndClose
。它没有ClientBase
的{{1}}方法。所以基本上我不能在通道上异步执行操作来释放,以便我可以使用该通道执行其他操作。
我只是为每个操作创建了通道,它解决了问题
所以我的问题是:
哪个更好(BeginOperation/EndOperation
)w.r.t到我的场景,特别是我想在多个线程的同时对服务对象执行多个操作
建议为每个操作创建一个频道吗?
事实上,我认为我们在两个端点(客户端/服务)之间只能有一个通道。但我可以创建尽可能多的频道。例如:我能够创建通道的Int16.MaxValue。所以不确定这个限制和建议是什么。
ClientBase vs. ChannelFactory
所以基本上你能告诉我关于频道,推荐和技巧的基础知识......等等。:)
答案 0 :(得分:27)
使用ClientBase
和ChannelFactory<T>
之间的异步是有区别的。基本上ClientBase
使用事件驱动的异步模型。
我在工作中开发的应用程序中广泛使用ChannelFactory<T>
,主要是因为合同在应用程序的公共库中可用,我不喜欢使用Add Service Reference。我在创建时缓存了ChannelFactory的每个唯一实例,然后当我需要调用一个操作时,我将打开该实例的通信通道,拨打电话,关闭通信通道。
WCF的大部分启动成本都是创建客户端,这样您只需在应用程序的生命周期内支付一次 - 创建通信渠道非常简单。
有关ClientBase
和ChannelFactory<T>
的异步的更多信息,请参阅:
How to: Call WCF Service Operations Asynchronously
How to: Call Operations Asynchronously Using a Channel Factory