gpt4 book ai didi

.net - 如何实现异步运行的可重用命名管道监听器?

转载 作者:行者123 更新时间:2023-12-03 19:42:00 25 4
gpt4 key购买 nike

我找不到一个很好的例子来说明如何创建一个异步运行的可重用命名管道监听器。我可以制作一个可重用的监听器:

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(虽然我不知道这是什么意思)。我想我只需要做一些类似的事情,每次清理管道,就像我列出的第一个代码示例,但我还没有让它工作。

最佳答案

我想我已经明白了:

pipeServer = new NamedPipeServerStream("MyPipe", PipeDirection.InOut, 1, PipeTransmissionMode.Message, PipeOptions.Asynchronous);

Boolean connectedOrWaiting = false;

Byte[] buffer = new Byte[65535];

while (running)
{
if (!connectedOrWaiting)
{
pipeServer.BeginWaitForConnection((a) => { pipeServer.EndWaitForConnection(a); }, null);

connectedOrWaiting = true;
}

if (pipeServer.IsConnected)
{
Int32 count = pipeServer.Read(buffer, 0, 65535);

if (count > 0)
{
UTF8Encoding encoding = new UTF8Encoding();
String message = encoding.GetString(buffer, 0, count);

MessageBox.Show(message);
}

pipeServer.Disconnect();

connectedOrWaiting = false;
}
}

这将在收到多条消息时接受,并在运行设置为 false 时立即关闭(显然在另一个线程中)。这似乎是我需要的。有人可以验证我没有做任何傻事吗?

关于.net - 如何实现异步运行的可重用命名管道监听器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3806270/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com