我找不到一个很好的例子来说明如何创建一个异步运行的可重用命名管道侦听器。我可以制作一个可重用的侦听器:
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(尽管我无法弄清楚这意味着什么)。我想我只需要做一些类似于每次清理管道的事情,就像我列出的第一个代码示例一样,但我还没有让它工作。