我已经实现了一个服务器/客户端测试装备,它使用带有net.pipe绑定的流传输模式。这是一种工作,但是当实际服务器的流实现在空缓冲区上阻塞时,我遇到了问题。即使我删除所有同步,将并发模式设置为多个我有一个问题,我的客户端应用程序在stream.Read上阻塞。
因此我的客户端使用" GetStream"来启动与服务器的连接。调用(在非UI线程上),服务器返回的实际流实现是阻塞流(例如NetStream),因此当没有可读取的字节时它将阻塞。这导致服务主机完全锁定,所以现在客户端无法进行任何进一步的调用,直到stream.read操作解除阻塞。
有人可以对这种行为有所了解吗?
答案 0 :(得分:0)
我已经解决了匿名管道的工作代码,命名管道异步和同步。根据我的经验,我可以告诉你,你只是不能拥有共享内存缓冲区“空”。我相信,即使在异步中,也会创建后台线程来同步读写。
所以目前只考虑这个事实,
服务器必须先发送写入缓冲区=>客户应该读它=>客户必须回写该缓冲区=>服务器必须阅读它。
对于不冻结的应用程序,该周期必须永远重复。我开始认为这是通过服务器/客户端套接字使共享内存通信不同的原因。在共享内存方法中,您可能不必担心同步,它也会将客户端专用于服务器,以使客户端不能与服务器一起存在。
答案 1 :(得分:0)
你应该看看使用旧的' async'样式开始/结束读/写方法允许异步通信。不幸的是,.net中的命名管道没有异步/等待支持 - 但是,您可以使用TaskFactory.FromAsync
方法将它们包装起来。