2

投票サーバーとクライアントを作成しようとしているので、プログラムを起動すると投票フォームが表示され、さまざまな項目に投票できます。サーバー部分では、サーバーを別のスレッドで実行していますが、多くのCPUを使用していますが、使用しているCPUの量を減らすにはどうすればよいですか?

これは私のサーバーです:

        Form1 main = new Form1();

        try
        {
            IPAddress ipAd = IPAddress.Parse(main.ipAddress); //use local m/c IP address, and use the same in the client

            /* Initializes the Listener */
            TcpListener myList = new TcpListener(ipAd, 55548);

            /* Start Listeneting at the specified port */
            myList.Start();

            while (true)
            {
                string message = "";
                Socket s = myList.AcceptSocket();



                if (main.users.Contains(s.RemoteEndPoint.ToString()) == false)
                    main.users.Add(s.RemoteEndPoint.ToString());



                byte[] b = new byte[500];
                int k = s.Receive(b);



                for (int i = 0; i < k; i++)
                {
                    message += (Convert.ToString(b[i]));
                }

                string[] messageArray = message.Split('/');

                MessageBox.Show("help");

                if (messageArray[0].CompareTo("vote") == 0)
                {

                    if (main.votes.ContainsKey(messageArray[1]) != true) main.votes.Add(messageArray[1], 1);
                    else main.votes[messageArray[1]]++;

                    string[] temp = main.textBox1.Text.Split(' ');
                    int numVotes = Convert.ToInt32(temp[1]);
                    numVotes++;
                    main.textBox1.Text = temp[0] + " " + Convert.ToString(numVotes);

                }
                if (messageArray[0].CompareTo("start") == 0)
                {
                    main.updateEverything();
                }
                if(messageArray[0].CompareTo("withdraw") == 0)
                {
                    main.votes[messageArray[1]]--;

                    string[] temp = main.textBox1.Text.Split(' ');
                    int numVotes = Convert.ToInt32(temp[1]);
                    numVotes--;
                    main.textBox1.Text = temp[0] + " " + Convert.ToString(numVotes);
                }

                /* clean up */
                s.Close();
                myList.Stop();
            }
        }
        catch (Exception e)
        {
            Console.WriteLine("Error..... " + e.StackTrace);
        }
4

2 に答える 2

1

ブロッキングタイプの接続を使用しています。作成したループにより、TcpListener.AcceptConnection()が原因でCPUオーバーヘッドが発生します。解決策は、非ブロッキングソケット接続を受け入れることです。これは、ソケットから非同期でデータを受信することによって行われます。

これがその仕組みを説明するmsdnリンクです。 http://msdn.microsoft.com/en-us/library/dxkwh6zw.aspx

于 2012-12-18T00:19:05.510 に答える
0

基本的にパフォーマンスに影響を与える文字列の連結があるようです。StringBuilderを使用してみてください-メッセージ変数はStringBuilder型である必要があります。

于 2012-12-18T00:14:21.497 に答える