1

マルチスレッド サーバーを使用してクライアント通信を処理していますが、このサーバーが処理できるクライアントの数がわかりません。クライアント数が増えた場合、対応できますか?core2duo プロセッサで使用しています。クライアントの半分を別のポートを持つ新しいサーバーにリダイレクトする場合、別のポートでサーバーを起動すると問題は解決しますか?

ここにサーバー用の私のコードがあります

Public void ListenForClients()
        {
            this.tcpListener.Start();

            while (true)
            {      
                try
                {
                    TcpClient client = this.tcpListener.AcceptTcpClient();
                    NetworkStream clientStream = client.GetStream();   //create networkstream for connected client                         
                    Console.WriteLine(((IPEndPoint)client.Client.RemoteEndPoint).Address.ToString());//client ipaddress
                    Console.WriteLine("connecting..");
                    Thread clientThread = new Thread(new ParameterizedThreadStart(updatedb));                    
                    clientThread.Start(client);

                }
                catch (Exception ex)
                {
                    Console.WriteLine("exception" + ex.ToString());
                    Console.ReadLine();
                }
            }
        }

4

2 に答える 2

2

このブログ投稿と著者による同様の投稿を読むことをお勧めします。IIS / ASP.NET でマルチスレッドがどのように使用されているかについて、彼は非常に詳細に説明しています。
覚えておく必要があるのは、(たとえば、提案したように、アプリケーションの別のインスタンスを実行することによって) より多くのスレッドを作成できたとしても、アプリケーションの応答性が向上したり、クライアントに期待される回答をより速く返したりするわけではないということです。サーバーが持つCPUの数と同じ数のスレッドしか実行できないためです。
崩壊を期待してコードを書く必要はないと思いますが、ISSサーバー(実際には同じことをしています-TCP接続にサービスを提供しています)が行っているように、より多くの非同期処理の方向で作業する必要があります。.NET が提供するスレッド プールを使用しない理由はありません。.NET によって、共存するスレッドの実際の数が常に処理され、スレッドが使用可能になるまで他の要求がキューに入れられます。

于 2012-06-23T16:53:19.333 に答える
0

実際に試さずに、他のすべては推測です。Hans Passantが言うように、すべてのリクエストに対して新しいスレッドを作成するという戦略は、うまく拡張できません。最初は問題ないように見えるかもしれませんが、数百人の同時ユーザーを超えるとパフォーマンスが大幅に低下するはずです。さらに、作業はデータベース(updatedb)と通信しているように見えるので、作成したこれらのスレッドは、データを外部プロセスに送信し、応答を待っているだけですか?これはスレッドの最悪の使用法です。非同期SQL更新を使用できるかどうかを確認してください。

于 2012-06-23T14:44:12.067 に答える