繁体   English   中英

WCF命名为管道流

[英]WCF Named Pipe Streaming

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

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

有人可以阐明这种行为吗?

我已经解决了匿名管道(异步和同步管道)的工作代码。 从我的经验来看,您不能拥有共享内存缓冲区“空”。 我相信,即使在异步模式下,也会创建后台线程以进行同步读写。

因此,现在考虑一下这个事实,

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

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

您应该查看使用较旧的“异步”样式的Begin / End Read / Write方法以允许异步通信。 不幸的是,.net中没有对命名管道的异步/等待支持-但是,您可以使用TaskFactory.FromAsync方法包装它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM