1

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();
    }
}

これを実行すると、クライアントの 1 つが Connect() で失敗し、サーバーが BeginWaitForConnection で失敗します - パイプが閉じられていると言っています。各クライアントが破棄する前に少なくとも Thread.Sleep(100) を追加すると、すべて正常に動作します。私がやっていることはまれなケースだと確信していますが、パイプはこれを優雅に処理できるはずです。

何が間違っている可能性がありますか?

ありがとう!

4

1 に答える 1