Я могу '» Я нашел хороший пример того, как создать многоразовый прослушиватель именованного канала, который работает асинхронно. Я могу сделать многоразовый слушатель:
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 (хотя я не могу понять, что это значит). Думаю, мне просто нужно сделать что-то похожее на это, где канал очищается каждый раз, как в первом примере кода, который я перечислил, но я еще не заставил это работать.