【发布时间】:2011-04-17 21:39:45
【问题描述】:
我找不到一个很好的例子来说明如何创建一个异步运行的可重用命名管道侦听器。我可以制作一个可重用的监听器:
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)错误代码在这里:msdn.microsoft.com/en-us/library/ms681381(VS.85).aspx 但是没有错误 2316... 你确定这是错误代码吗?您能否提供异常的完整详细信息(包括类型和消息?
-
对不起,我直到现在才看到这个,我不再产生错误。这是在作者端产生它的代码: if (pipe == INVALID_HANDLE_VALUE) { cout
-
原来是错误 231。6 是从别的东西输出的。
标签: .net asynchronous named-pipes reusability