我是WCF的新手.最初,我创建了一个WCF服务,并使用生成的客户端代理来使用来自客户端的服务.因此,每当我在服务上执行某些操作时,所有按顺序执行的操作都会同步调用操作.我将并发模式更改为多个,但操作仍然是同步进行的.然后我为我的操作生成了异步方法,并使用了开始/结束模式,因此我猜测它"释放"了通道并让操作并行/异步地增加了我的应用程序的吞吐量.
然后我用来ChannelFactory
创建一个通道并执行操作,因为客户端和服务器可以共享合同(同一个项目).但IClientChannel
只提供BeginOpen/EndOpen/BeignClose/EndClose
.它不具备ClientBase
的BeginOperation/EndOperation
方法.所以基本上我不能在通道上异步执行操作来释放,以便我可以使用该通道执行其他操作.
我只是为每个操作创建了通道,它解决了这个问题
所以我的问题是:
哪个更好(ClientBase vs. ChannelFactory
)wrt到我的场景特别是我想同时用多个线程对服务对象执行多个操作
是否建议为每个操作创建一个通道?
事实上,我认为我们在两个端点(客户端/服务)之间只能有一个通道.但我可以创建尽可能多的频道.例如:我能够创建通道的Int16.MaxValue.所以不确定这个限制和建议是什么.
Service[] channels = new IService[Int16.MaxValue];
for(int i = 0; i<Int16.MaxValue; i++)
{
channels[i] = factory.CreateChannel();
}
Run Code Online (Sandbox Code Playgroud)所以基本上你能告诉我有关频道,推荐和技巧的基础知识......等等.:)
Tim*_*Tim 27
使用ClientBase
和之间的异步是有区别的ChannelFactory<T>
.基本上ClientBase
使用事件驱动的异步模型.
我曾经ChannelFactory<T>
在我在工作中开发的应用广泛,主要是因为合同中的应用程序中的公共库是可利用的,我不喜欢使用添加服务引用.我在创建时缓存ChannelFactory的每个唯一实例,然后当我需要调用一个操作时,我将打开该实例的通信通道,拨打电话,关闭通信通道.
WCF的大部分启动成本都是创建客户端,这样您只需在应用程序的生命周期内支付一次 - 创建通信渠道是微不足道的.
有关异步获取更多信息ClientBase
,并ChannelFactory<T>
请参阅: