C# 在命名管道上读写和从命名管道中读写

C# 在命名管道上读写和从命名管道中读写,c#,wpf,multithreading,ipc,named-pipes,C#,Wpf,Multithreading,Ipc,Named Pipes,我正在为此目的编写的测试应用程序中使用命名管道尝试IPC。我想从管道中读取一个值,但读取器似乎什么都没读 我正在启动一个服务器进程和一个客户端。服务器使用名为InitPipe的命名管道来告诉客户端新管道的名称,以便进行通信。之后,一个新的服务器进程和客户端连接到新管道,另一个服务器进程和客户端断开连接,并重新打开InitPipe,以便新进程与服务器通信。 客户端将数据写入管道,新的服务器进程应该读取数据。这就是问题所在。服务器似乎无法从管道中获取值 private void svr_task(s

我正在为此目的编写的测试应用程序中使用命名管道尝试IPC。我想从管道中读取一个值,但读取器似乎什么都没读

我正在启动一个服务器进程和一个客户端。服务器使用名为
InitPipe
的命名管道来告诉客户端新管道的名称,以便进行通信。之后,一个新的服务器进程和客户端连接到新管道,另一个服务器进程和客户端断开连接,并重新打开
InitPipe
,以便新进程与服务器通信。 客户端将数据写入管道,新的服务器进程应该读取数据。这就是问题所在。服务器似乎无法从管道中获取值

private void svr_task(string comPipe)
    {
        var server = new NamedPipeServerStream(comPipe);
        write("Com-Pipe: " + comPipe);        //'write' just writes to a TextBox on the UI thread

        server.WaitForConnection();
        write("Client connected: " + comPipe);

        StreamReader reader = new StreamReader(server);
        StreamWriter writer = new StreamWriter(server);

        while (server.IsConnected)
        {
            var line = reader.ReadLine();     //the program doesn't seem to run past this line

            write(line);
        }
        write("Client disconnected: " + comPipe);
        server.Dispose();
        write("Com-Pipe closed: " + comPipe);
    }

    private void cl_start()
    {
        //This is for InitPipe
        var clientInit = new NamedPipeClientStream("InitPipe");
        NamedPipeClientStream client = new NamedPipeClientStream("InitPipe");

        clientInit.Connect();
        Dispatcher.Invoke(() => stat_cl1.Content = "Initialize...");
        StreamReader reader = new StreamReader(clientInit);
        StreamWriter writer = new StreamWriter(clientInit);

        while (clientInit.IsConnected)
        {
            var line = reader.ReadLine();
            client = new NamedPipeClientStream(line);
            clientInit.Dispose();
        }

        //This is where the communication with the server thread starts
        client.Connect();
        Dispatcher.Invoke(() => stat_cl1.Content = "Connected");
        reader = new StreamReader(client);
        writer = new StreamWriter(client);

        while (client.IsConnected)
        {
            string line = Dispatcher.Invoke(() => box_cl1.Text);      //read a value from a textbox (This works)

            writer.Write(line);
            writer.Flush();
        }

        client.Dispose();
        Dispatcher.Invoke(() => stat_cl1.Content = "Not connected");
    }
我希望服务器线程从客户端线程接收值。UI线程未锁定,因此我可以启动另一个客户端,该客户端也可以连接到服务器线程。
在VS中调试并单步执行代码时,它只在
var line=reader.ReadLine()之后运行并且似乎永远不会到达下一行。这就是为什么我认为它不能从管道中读取任何值。但是我需要改变什么呢?我想用
write
输出值,但我遇到了类似的问题。这与命名管道的工作方式有关。一次可以向命名管道写入数据,也可以从命名管道读取数据。尝试不要同时将StreamReader和StreamWriter附加到流。我分别通过读写器流和写器流来解决这个问题。此外,您可以对多个客户端使用相同的管道名称,只需在客户端连接后创建一个新的服务器实例