1

名前付きパイプをリッスンしてユーザースペースから実行されるプログラムと対話するコンポーネントを持つWindowsサービスを作成しています。この回答のコードをマルチスレッドサーバー実装のベースとして使用しましたが、以下に再現されているように、タイトなループで呼び出されるProcessNextClientアクションから強いコードの臭いがします。別のストリームの開口部が名前付きパイプにいつ追加されるかを知るには、IOExceptionを繰り返しキャッチして再試行するよりも、本当に良い方法はありませんか?

    public void ProcessNextClient()
    {
        try
        {
            NamedPipeServerStream pipeStream = new NamedPipeServerStream(PipeName, PipeDirection.InOut, 254);
            pipeStream.WaitForConnection();

            //Spawn a new thread for each request and continue waiting
            Thread t = new Thread(ProcessClientThread);
            t.Start(pipeStream);
        }
        catch (Exception e)
        {//If there are no more avail connections (254 is in use already) then just keep looping until one is avail
        }
    }
4

2 に答える 2

1

パイプを処理するためにWCFに任せることができますか?アプリケーションに新しい接続が確立されたときにアプリケーションコードに通知するためにIO完了ポートを使用する割り込み駆動型システムのメリットがあります。

WCFの実装に苦労することで、バインディングをパイプからTCP / httpバインディングに変更するだけで、アプリケーションを複数のノードに引き継ぐ必要がある場合に、1台のマシンをスケールオフすることもできます。

WCFサービスの実装例はここにあります。また、パイプまたはTCPで同じサービスをホストする方法も示しています。

于 2013-10-17T02:17:27.087 に答える
0

コードが置かれるように私には見えます

pipeStream.WaitForConnection();

クライアントが検出されるまで続行します。クライアントに打たれていない限り、あなたが説明したようにループしているとは思いません。チェックするブレークポイントをいつでも追加できます。

于 2013-03-26T20:08:18.283 に答える