WCF - 渠道工厂与客户群

时间:2011-10-16 09:48:00

标签: wcf wcf-client

我是WCF的新手。最初,我创建了一个WCF服务,并使用生成的客户端代理来使用来自客户端的服务。因此,每当我在服务上执行某些操作时,所有按顺序执行的操作都会同步调用操作。我将并发模式更改为多个,但操作仍然是同步进行的。然后我为我的操作生成了异步方法,并使用了开始/结束模式,因此我想“释放”通道并让操作并行/异步地增加我的应用程序的吞吐量。

然后我使用ChannelFactory创建一个频道并执行操作,因为客户端和服务器可以共享合同(同一个项目)。但IClientChannel仅提供BeginOpen/EndOpen/BeignClose/EndClose。它没有ClientBase的{​​{1}}方法。所以基本上我不能在通道上异步执行操作来释放,以便我可以使用该通道执行其他操作。

我只是为每个操作创建了通道,它解决了问题

所以我的问题是:

  1. 哪个更好(BeginOperation/EndOperation)w.r.t到我的场景,特别是我想在多个线程的同时对服务对象执行多个操作

  2. 建议为每个操作创建一个频道吗?

  3. 事实上,我认为我们在两个端点(客户端/服务)之间只能有一个通道。但我可以创建尽可能多的频道。例如:我能够创建通道的Int16.MaxValue。所以不确定这个限制和建议是什么。

    ClientBase vs. ChannelFactory
  4. 所以基本上你能告诉我关于频道,推荐和技巧的基础知识......等等。:)

1 个答案:

答案 0 :(得分:27)

使用ClientBaseChannelFactory<T>之间的异步是有区别的。基本上ClientBase使用事件驱动的异步模型。

我在工作中开发的应用程序中广泛使用ChannelFactory<T>,主要是因为合同在应用程序的公共库中可用,我不喜欢使用Add Service Reference。我在创建时缓存了ChannelFactory的每个唯一实例,然后当我需要调用一个操作时,我将打开该实例的通信通道,拨打电话,关闭通信通道。

WCF的大部分启动成本都是创建客户端,这样您只需在应用程序的生命周期内支付一次 - 创建通信渠道非常简单。

有关ClientBaseChannelFactory<T>的异步的更多信息,请参阅:

How to: Call WCF Service Operations Asynchronously

How to: Call Operations Asynchronously Using a Channel Factory