我正在构建一个使用 IPC 命名管道的应用程序。在开始编写压力测试时,我发现了一个与客户端快速连接断开相关的问题。
服务器代码:
static void ServerThread()
{
var serverPipe = new NamedPipeServerStream("myipc", PipeDirection.InOut, -1, PipeTransmissionMode.Message, PipeOptions.Asynchronous | PipeOptions.WriteThrough);
serverPipe.BeginWaitForConnection(
ar =>
{
var thisPipe = (NamedPipeServerStream)ar.AsyncState;
thisPipe.EndWaitForConnection(ar);
Task.Factory.StartNew(ServerThread);
thisPipe.Dispose();
},
serverPipe);
}
客户端除了连接断开之外什么都不做,如下所示:
static void RunClients()
{
for (int i = 0; i < 100; i++)
{
var clientPipe = new NamedPipeClientStream(".", "myipc", PipeDirection.InOut, PipeOptions.Asynchronous | PipeOptions.WriteThrough);
clientPipe.Connect(1000);
clientPipe.Dispose();
}
}
当它运行时,其中一个客户端在 Connect() 中失败,而服务器在 BeginWaitForConnection 中失败 - 说管道正在关闭。如果我在每个客户端处理之前至少添加 Thread.Sleep(100) - 一切正常。我确定我正在做的是一个角落案例,但我相信管道应该能够以优雅的方式处理这个问题。
关于什么可能是错误的任何想法?
谢谢!