C# 检查NamedPipeClientStream写入是否成功

C# 检查NamedPipeClientStream写入是否成功,c#,named-pipes,C#,Named Pipes,基本上是标题。。。我希望获得关于weatherNamedPipeServerStream对象成功接收到值的相同反馈。这是起始代码: static void Main(string[] args){ Console.WriteLine("Client running!"); NamedPipeClientStream npc = new NamedPipeClientStream("somename"); npc.Connect(); // npc.WriteTimeout =

基本上是标题。。。我希望获得关于weather
NamedPipeServerStream
对象成功接收到值的相同反馈。这是起始代码:

static void Main(string[] args){
  Console.WriteLine("Client running!");

  NamedPipeClientStream npc = new NamedPipeClientStream("somename");
  npc.Connect();

  // npc.WriteTimeout = 1000; does not work, says it is not supported for this stream
  byte[] message = Encoding.UTF8.GetBytes("Message");
  npc.Write(message);

  int response = npc.ReadByte();
  Console.WriteLine("response; "+response);

}
在每次读取时,我都从NamedPipeServerStream实现了一个小的回显消息。我想我可以添加一些异步超时来检查npc.ReadByte()是否正确;确实返回了200ms的值。与TCP数据包的确认方式类似

是否有更好的方法来检查
namedPipeClientStream.Write()
是否成功

我希望对weather NamedPipeServerStream对象成功接收到值有相同的反馈

确保您发送的数据已被远程端点的客户端接收并成功处理的唯一方法是让您自己的应用程序协议包含此类确认

一般来说,您可以假设如果发送操作成功完成,则连接仍然有效,并且远程端点正在获取数据。如果连接出现问题,您最终会在发送数据时出错

然而,这一假设仅限于此。网络I/O通常在多个级别进行缓冲。几乎可以肯定,任何发送操作都只需要将数据放入网络层的本地缓冲区中。操作的方法调用将在数据被缓冲后立即返回,而不考虑远程端点是否已接收到它(事实上,在调用返回时几乎永远不会接收到)

因此,如果此类调用引发异常或报告错误,则完全有可能之前发送的一些数据也在传输过程中丢失

如何最好地解决这种可能性取决于您正在尝试做什么。但总的来说,你根本不应该担心它。如果接收到特定的传输,这通常无关紧要。只要您可以继续传输而不出错,连接就可以了,请求确认只是不必要的开销

如果您希望处理发生错误的情况,使连接无效,迫使您重试,并且希望使更广泛的操作可恢复(例如,您将一些数据流传输到远程端点,并希望确保所有数据都已接收,而不必重新发送已接收的数据),然后,您应该在应用程序协议中构建恢复功能,在重新连接远程端点时,会报告到目前为止接收到的字节数,或最新的消息ID,或者应用程序协议需要了解重新开始发送的位置

另请参见这个非常密切相关的问题(可能甚至是一个实际的副本…虽然它没有特别提到命名管道,但几乎所有网络I/O都会涉及类似的问题):

这里有一个很好的答案,还有链接到这个答案中更有用的问答