我找不到一个很好的示例,说明如何创建异步运行的可重用命名管道侦听器。我可以做一个可重复使用的监听器:如何实现异步运行的可重用的命名管道侦听器?
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(尽管我无法弄清楚这意味着什么)。我想我只需要做一些类似这样的事情,每次都会清理管道,就像我列出的第一个代码示例一样,但我还没有完成这项工作。
系统(即Win32 API)错误代码在这里:http://msdn.microsoft.com/en-us/library/ms681381(VS.85).aspx但没有错误2316 ...你确定那是错误代码?你能否包括例外的全部细节(包括类型和消息?) – Richard 2010-09-28 15:54:17
对不起,我直到现在才看到这个,我不再产生这个错误,这是在作者的最后产生它的代码:如果(管== INVALID_HANDLE_VALUE) \t \t { \t \t \t的cout << “错误:” << GetLastError函数(); \t \t} – 2010-09-28 20:12:34
事实证明这是错误231.从别的东西的6输出 – 2010-10-07 18:29:09