2

この回答のコードを使用する - Async two-way communication with Windows Named Pipes (.Net) - 一度に接続/クライアントの最大数が 10 であることを発見しました。

以下の大まかな例 (これは複数のスレッドを使用します。複数のプロセスが使用されている場合も同じことが起こります) では、クライアント 1 から 10 が開始され、通常どおりに実行されます。ただし、「ProcessData」が呼び出されると、クライアント 11 および 12 がブロックされ、最終的に TimeoutException がスローされます。

    public static void Start()
    {
        // Start Server
        new Thread(new ThreadStart(Server.MainRun)).Start();

        // Start Clients
        for (int i = 1; i <= 12; i++)
        {
            Thread.Sleep(500);
            Client c = new Client(i.ToString());
            new Thread(new ThreadStart(c.Run)).Start();
        }
    }

    // Create a contract that can be used as a callback
    public interface IMyCallbackService
    {
        [OperationContract(IsOneWay = true)]
        void NotifyClient();
    }

    // Define your service contract and specify the callback contract
    [ServiceContract(CallbackContract = typeof(IMyCallbackService))]
    public interface ISimpleService
    {
        [OperationContract]
        string ProcessData();
    }

    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
    public class SimpleService : ISimpleService
    {
        public string ProcessData()
        {
            // Get a handle to the call back channel
            var callback = OperationContext.Current.GetCallbackChannel<IMyCallbackService>();

            callback.NotifyClient();
            return DateTime.Now.ToString();
        }
    }

    class Server
    {
        public static void MainRun()
        {
            // Create a service host with an named pipe endpoint
            using (var host = new ServiceHost(typeof(SimpleService), new Uri("net.pipe://localhost")))
            {
                host.AddServiceEndpoint(typeof(ISimpleService), new NetNamedPipeBinding(), "SimpleService");
                host.Open();

                Console.WriteLine("Simple Service Running...");
                Console.ReadLine();

                host.Close();
            }
        }
    }

    class Client : IMyCallbackService
    {
        string _id;

        public Client(string ID)
        {
            _id = ID;
        }

        public void Run()
        {
            Console.WriteLine("Starting client : " + _id);
            // Consume the service
            var factory = new DuplexChannelFactory<ISimpleService>(new InstanceContext(this), new NetNamedPipeBinding(), new EndpointAddress("net.pipe://localhost/SimpleService"));
            var proxy = factory.CreateChannel();

            Console.WriteLine(proxy.ProcessData());

            Console.WriteLine("Client finished : " + _id);
        }

        public void NotifyClient()
        {
            Console.WriteLine("Notification from Server");
        }
    }

完了時にクライアントがチャネルを閉じると (factory.Close())、すべてのクライアントが実行できるようになります。

この質問 - Number of Clients that can connect to a Named Pipe - は非常に似ていますが、下限がないことを示唆しています。

これは、Windows XP および 2000 マシンでの制限が 10 であることを示唆しています - http://msdn.microsoft.com/en-us/library/system.io.pipes.namedpipeclientstream.aspx - これが Windows 8 マシンおよび Windows で発生していることを除いて2008年サーバー。

この制限を変更する方法はありますか? 明らかな何かが欠けていますか?

4

2 に答える 2

0

「ゲスト」は正しく、 MSDNの古いブログ投稿は、これが現在の .net リリースでも適用可能であることを裏付けています。

また、既定の設定は、開発環境および "小規模な" 展開で使用するために定義されていることも示唆しています。

他の設定 (バッファ サイズなど) から、1 接続あたり 8kb を超えるオーバーヘッドが予想されることをお勧めします。

値がより大きな値 (例: >1000) に合わせて調整された場合にどのような問題が発生する可能性があるかについての情報はまだ見つかりません: API はより短くバースト的なリクエストに合わせて調整されているようで、大きな値の場合は単に非効率的であると思われます (そうではありません)。多くはメモリ用ですが、内部実装のみです) -

かなりの数のクライアントがエンドポイントに接続している場合のパフォーマンス/問題 (または成功) に関する証拠を歓迎します。

于 2017-04-25T08:46:24.757 に答える