我已经实现了一个服务器/客户端测试平台,使用流传输模式与网络。管绑定。这是所有类型的工作,但我遇到了一个问题,当实际的服务器的流实现块上的空缓冲区。即使我删除所有同步,将并发模式设置为多个,我也有一个问题,我的客户端应用程序阻塞在stream.Read.
所以我的客户端发起了一个连接到服务器的"GetStream"调用(在一个非ui线程上),实际的流实现是由服务器返回的阻塞流(比如NetStream),所以当没有可用的字节读取时,它会阻塞。这将导致服务主机的完全锁定,因此现在客户端无法在流之前进行任何进一步的调用。读取操作解除阻塞。
有人能解释一下这种行为吗?
我已经解决了一个匿名管道的工作代码,命名管道异步和同步。根据我的经验,我可以告诉你,你只是不能有共享内存缓冲区"空"。我相信,即使在异步模式下,创建后台线程也是为了同步读写。
现在我们考虑一下这个事实,
服务器必须先写缓冲区=>客户端应该读它=>客户端必须回写缓冲区=>服务器必须读它
为了应用程序不冻结,这个循环必须永远重复。我开始认为这就是通过服务器/客户端套接字使共享内存通信不同的原因。在共享内存方法中,您可能不必担心同步,而且它将客户端专用于服务器,因此客户端不能与服务器共存。
你应该考虑使用旧的'async'风格的Begin/End Read/Write方法来允许异步通信。不幸的是,.net中没有对命名管道的async/await支持——然而,你可以使用TaskFactory.FromAsync
方法包装它们。