Чтение и запись на и из именованного канала - PullRequest
1 голос
/ 07 июня 2019

Я пробую 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");
    }

Я хочу, чтобы поток сервера получил значения из потока клиента.Поток пользовательского интерфейса не заблокирован, поэтому я могу запустить другого клиента, который также может подключаться к потоку сервера.При отладке в VS и пошаговом выполнении кода он просто запускается после var line = reader.ReadLine(); и, похоже, никогда не перейдет на следующую строку.Вот почему я думаю, что он не может прочитать какие-либо значения из канала.Но что мне нужно изменить?Я хочу вывести значение с помощью write.

...