Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WCF命名管道流_C#_Wcf_Stream_Ipc_Blocking - Fatal编程技术网

C# WCF命名管道流

C# WCF命名管道流,c#,wcf,stream,ipc,blocking,C#,Wcf,Stream,Ipc,Blocking,我已经实现了一个服务器/客户端测试平台,它使用带有net.pipe绑定的流传输模式。这是所有类型的工作,但是当实际服务器的流实现在空缓冲区上阻塞时,我遇到了一个问题。即使我删除了所有同步,也要将并发模式设置为multiple,因为我的客户端应用程序在stream.Read上遇到了阻塞问题 因此,我的客户端通过一个“GetStream”调用(在非UI线程上)启动到服务器的连接,服务器返回的实际流实现是一个阻塞流(例如NetStream),因此当没有可读取的字节时,它将阻塞。这将导致服务主机完全锁定

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

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


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

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

所以现在考虑一下这个事实,即

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


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

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