Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.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# 命名管道服务器&;客户端-无消息_C#_Named Pipes - Fatal编程技术网

C# 命名管道服务器&;客户端-无消息

C# 命名管道服务器&;客户端-无消息,c#,named-pipes,C#,Named Pipes,我正在努力学习如何使用命名管道。所以我在LinqPad中创建了一个服务器和客户端 这是我的服务器: var p = new NamedPipeServerStream("test3", PipeDirection.Out); p.WaitForConnection(); Console.WriteLine("Connected!"); new StreamWriter(p).WriteLine("Hello!"); p.Flush(); p.WaitForPipeDrain(); p.Close

我正在努力学习如何使用命名管道。所以我在LinqPad中创建了一个服务器和客户端

这是我的服务器:

var p = new NamedPipeServerStream("test3", PipeDirection.Out);
p.WaitForConnection();
Console.WriteLine("Connected!");
new StreamWriter(p).WriteLine("Hello!");
p.Flush();
p.WaitForPipeDrain();
p.Close();
这是我的客户:

var p = new NamedPipeClientStream(".", "test3", PipeDirection.In);
p.Connect();
var s = new StreamReader(p).ReadLine();
Console.Write("Message: " + s);
p.Close();
我先运行服务器,然后运行客户机,我看到服务器上显示“已连接!”,这样它就可以正常连接了。但是,客户端总是显示
消息:
,后面什么也没有,因此数据实际上不是从服务器传输到要显示的客户端。我已经尝试过交换管道方向,并让客户端向服务器发送数据,结果相同

在本例中,为什么不在屏幕上打印数据?我错过了什么


谢谢

按如下方式更改服务器代码:

StreamWriter wr = new StreamWriter(p);
wr.WriteLine("Hello!\n");
wr.Flush();

您的字符串不会在StreamWriter中刷新,正如L.B所说,您必须刷新
StreamWriter
。但是使用模式使用
可以防止此类错误:

using (var p = new NamedPipeServerStream("test3", PipeDirection.Out))
{
    p.WaitForConnection(); 
    Console.WriteLine("Connected!"); 
    using (var writer = new StreamWriter(p))
    {
         writer.WriteLine("Hello!");
         writer.Flush();
    }
    p.WaitForPipeDrain(); 
    p.Close();
}

在上面的代码中,即使省略了
Flush()
Close()
,所有操作都会按预期工作(因为这些操作也是在处理对象时执行的)。此外,如果抛出任何异常,所有内容仍将被正确清理。

根据StreamReader.ReadLine文档,如果到达流结束,它将返回null。可能是在执行ReadLine时,管道中没有数据,流为空。如果s为null,您可能希望循环并再次尝试读取。是的,您需要在最高级别刷新(通常应避免在不首先关闭该流的所有用户的情况下关闭该流)。但是我认为不需要额外的
\n
。哇哦,就是这样!非常感谢你!!它看起来像p.WaitForPipeDrain();属于一行:使用块进入streamwriter。否则,使用块将关闭管道,并导致System.ObjectDisposedException Message=无法访问关闭的管道。