Как реализовать многоразовый прослушиватель именованного канала, который работает асинхронно?

Я могу '» Я нашел хороший пример того, как создать многоразовый прослушиватель именованного канала, который работает асинхронно. Я могу сделать многоразовый слушатель:

NamedPipeServerStream pipeServer = new NamedPipeServerStream("MyPipe", PipeDirection.InOut);

    while (true)
    {
            pipeServer.WaitForConnection();

            StreamReader reader = new StreamReader(pipeServer);

            MessageBox.Show(reader.ReadLine());

            pipeServer.Disconnect();
    }

и я могу сделать асинхронный слушатель:

NamedPipeServerStream pipeServer = new NamedPipeServerStream("MyPipe", PipeDirection.InOut, 1, PipeTransmissionMode.Message, PipeOptions.Asynchronous);

    pipeServer.BeginWaitForConnection((a) =>
    {
        pipeServer.EndWaitForConnection(a);

        StreamReader reader = new StreamReader(pipeServer);
        MessageBox.Show(reader.ReadLine());

    }, null);

Но я не могу заставить работать оба. Есть ли для этого хороший пример? Меня также беспокоят частично отправленные сообщения, поскольку я считаю, что это проблема с асинхронной связью, подобной этой.

Обновление : Я немного ближе.

pipeServer = new NamedPipeServerStream("MyPipe", PipeDirection.InOut, 1, PipeTransmissionMode.Message, PipeOptions.Asynchronous);

pipeServer.BeginWaitForConnection((a) =>
{
    pipeServer.EndWaitForConnection(a);

    StreamReader reader = new StreamReader(pipeServer);

    while (running)
    {
        String text = reader.ReadLine();

        if (String.IsNullOrEmpty(text) == false)
        {
            MessageBox.Show(text);
        }
    }

    MessageBox.Show("Done!");

}, null);

Это будет успешно прочитано один раз и продолжит цикл, а ReadLine вернет пустую пустую строку после первого успешного чтения. Так что он явно не блокирует и пытается прочитать снова. Проблема в том, что если я отправляю то же сообщение во второй раз, оно не принимается, а мой писатель говорит, что получает ошибку 2316 (хотя я не могу понять, что это значит). Думаю, мне просто нужно сделать что-то похожее на это, где канал очищается каждый раз, как в первом примере кода, который я перечислил, но я еще не заставил это работать.

6
задан casperOne 4 December 2012 в 16:52
поделиться