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