客户端检查命名管道主机是否已打开

时间:2014-11-27 17:37:48

标签: c# wcf named-pipes inter-process-communicat

我在同一台计算机上有一个自托管的WCF服务主机和客户端。我在这里使用WCF进行进程间通信。我可以打开主机并让客户端在一段时间后连接到它:

ServiceHost host = new ServiceHost(typeof(AIEngineLoader));

string hostAddress = string.Format("net.pipe://localhost/AIEngine/" + name);
var endPointBinding = new NetNamedPipeBinding();
endPointBinding.ReaderQuotas.MaxStringContentLength = int.MaxValue;
endPointBinding.ReceiveTimeout = TimeSpan.MaxValue;
host.AddServiceEndpoint(typeof(IAIEngineLoader), endPointBinding, hostAddress);            

host.Open();

主机在另一个控制台应用程序中运行。在启动控制台进程后等待一段时间后,客户端可以连接到此主机(现在为三秒)。我不想等待预定的时间,然后连接到主机。一种方法是在循环中阻塞等待,同时在客户端捕获CreateChannel异常。这个解决方案并不优雅。有没有办法让客户端检查主机是否正在监听而不诉诸异常捕获?

1 个答案:

答案 0 :(得分:2)

WCF不会简单地告诉您是否有人正在侦听该管道地址。管道的实际名称是obfuscated,您只能尝试连接并捕获异常。您可以使用named global mutex将WCF排除在等式之外,这是原始的进程间通信。但是,带管道的WCF本身就是IPC,所以我不会用互斥体使问题复杂化。这就像发送邮件和FedEx包一样让对方知道包裹正在发送。