我正在用C#开发一个应用程序。我创建了ServiceHost应用程序,它将托管wcf服务。 客户端将通过传递一些参数来调用ServiceHost.exe。 我已经尝试了以下方式。
static class ServiceHost
{
private static ITest channel = null;
static void Main(string[] args)
{
if (String.Compare(args[0], "dooperation", true) == 0)
{
NetNamedPipeBinding binding = new NetNamedPipeBinding(NetNamedPipeSecurityMode.Transport);
binding.ReceiveTimeout = TimeSpan.MaxValue;
EndpointAddress ep = new EndpointAddress(address);
channel = ChannelFactory<ITest>.CreateChannel(binding, ep);
channel.DoOpertion1();
channel.Close() // close service
// Make sure the application runs!
Application.Run();
GC.KeepAlive(m_singleInstance);
}
else if (String.Compare(args[0], "stop", true) == 0)
{
NetNamedPipeBinding binding = new NetNamedPipeBinding(NetNamedPipeSecurityMode.Transport);
binding.ReceiveTimeout = TimeSpan.MaxValue;
EndpointAddress ep = new EndpointAddress(address);
channel = ChannelFactory<ITest>.CreateChannel(binding, ep);
channel.DoOpertion2();
channel.Close() // close service
// Exit Appli
Application.Exit();
}
}
}
所以我在这里创建沟通渠道,调用方法和关闭渠道。 但是创建namepipe,然后通信通道和服务通道消耗更多时间,所以我想优化调用,以便每当客户端调用ServiceHost.exe时它将创建单个WCF服务通信通道实例。
有没有办法创建单一的频道实例? 如果我们继续打开namepine /沟通渠道会有任何副作用。
答案 0 :(得分:0)
重用WCF通道是反模式,通道不是线程安全的,您必须处理故障状态。通道的创建并不耗时,工厂的创建也是如此。所以你应该重用你的ChannelFactory。