WCF 命名管道流

Posted

技术标签:

【中文标题】WCF 命名管道流【英文标题】:WCF Named Pipe Streaming 【发布时间】:2014-03-29 09:53:33 【问题描述】:

我已经实现了一个服务器/客户端测试平台,它使用流传输模式和 net.pipe 绑定。这一切正常,但是当实际服务器的流实现阻塞在空缓冲区上时,我遇到了一个问题。即使我删除了所有同步,将并发模式设置为多个我也遇到了我的客户端应用程序在流上阻塞的问题。阅读。

所以我的客户端使用“GetStream”调用(在非 UI 线程上)启动与服务器的连接,服务器返回的实际流实现是阻塞流(例如 NetStream),因此它将阻塞当没有可供读取的字节时。这会导致服务主机完全锁定,因此现在客户端无法进行任何进一步的调用,直到 stream.read 操作解除阻塞。

有人能解释一下这种行为吗?

【问题讨论】:

【参考方案1】:

我已经解决了匿名管道的工作代码,命名管道异步和同步。根据我的经验,我可以告诉你,你不能让共享内存缓冲区“空”。我相信即使在异步中,也会创建后台线程来同步读写。

所以现在只考虑这个事实,

服务器必须首先将写入发送到缓冲区 => 客户端应该读取它 => 客户端必须写回该缓冲区 => 服务器必须读取它。

该循环必须永远重复,应用程序才不会冻结。我开始认为这就是通过服务器/客户端套接字使共享内存通信不同的原因。在共享内存方法中,您可能不必担心同步,它也将客户端专用于服务器,这样客户端就不能与服务器共存。

【讨论】:

【参考方案2】:

您应该考虑使用较旧的“异步”样式的 Begin/End 读/写方法来允许异步通信。不幸的是,.net 中没有对命名管道的 async/await 支持 - 但是,您可以使用 TaskFactory.FromAsync 方法包装它们。

【讨论】:

以上是关于WCF 命名管道流的主要内容,如果未能解决你的问题,请参考以下文章

未找到 WCF 命名管道端点

带有命名管道的 WCF:如何允许并行调用?

WCF 命名管道错误:管道已结束。 (109, 0x6d)

WCF 服务命名管道故障

使用命名管道 WCF 服务时通信对象出错

WCF 命名管道 IO 异常 - 管道已结束。 (109, 0x6d)