我用 C# 编写了一个简单的异步 NamedPipeStreamServer 进程,其核心是:
public void Listen()
{
bool shuttingDown = false;
while (!shuttingDown)
{
NamedPipeServerStream serverStream =
new NamedPipeServerStream(
"bobasdfpipe",
PipeDirection.InOut,
254,
PipeTransmissionMode.Message,
PipeOptions.Asynchronous);
IAsyncResult connectionResult =
serverStream.BeginWaitForConnection(
this.HandleConnection,
serverStream);
int waitResult =
WaitHandle.WaitAny(
new[]
{
this.ShutdownEvent,
connectionResult.AsyncWaitHandle
});
switch (waitResult)
{
case 0:
// this.ShutdownEvent
shuttingDown = true;
break;
case 1:
// connectionResult.AsyncWaitHandle
serverStream.EndWaitForConnection(connectionResult);
break;
}
}
}
我还为它编写了一个简单的客户端。客户端(它不是异步的)只是打开管道然后退出:
static void Main(string[] args)
{
using (
NamedPipeClientStream clientStream =
new NamedPipeClientStream(
".",
"bobasdfpipe",
PipeDirection.InOut))
{
clientStream.Connect();
}
}
如果我启动服务器,然后启动一个客户端或多个客户端,一切似乎都正常。
如果我在没有启动服务器的情况下启动客户端,客户端会挂起 Connect() 调用,直到我启动服务器,但是当我启动服务器时,服务器会在 BeginWaitForConnection( ) 呼叫,说“管道正在关闭。”
我发现其他人在 BeginWaitForConnection() 上有“管道正在关闭”错误,但它们都是由于尝试对同一个 NamedPipeServerStream 实例进行第二次 BeginWaitForConnection() 调用而引起的。这不是这里发生的事情 - 我为每个 BeginWaitForConnection() 调用创建了一个不同的 NamedPipeServerStream 实例,即使我没有,它在第一个 BeginWaitForConnection() 调用上仍然失败。
难道我做错了什么?或者这只是正常的 - 等待服务器启动的命名管道客户端将在服务器的第一个 BeginWaitForConnection() 调用中导致“管道正在关闭”?
我注意到,如果我再试一次 - 即吸收异常并执行另一个 BeginWaitForConnection() - 然后我会为每个等待服务器启动的客户端获得一个这样的异常,但在处理完所有这些之后,此后服务器似乎工作正常。
编辑:这是 HandleConnection 方法,但我认为它甚至不会命中此代码:
private void HandleConnection(IAsyncResult iar)
{
NamedPipeServerStream serverStream =
(NamedPipeServerStream)iar.AsyncState;
Log.Info("So, that happened.");
Thread.Sleep(1000);
Log.Info("Giving up.");
}