C#使用大量CPU在线程上运行服务器

C#使用大量CPU在线程上运行服务器,c#,tcpserver,C#,Tcpserver,我正在尝试编写一个投票服务器和客户端,所以你启动程序,它显示投票表格,你可以对各种项目进行投票。对于服务器部分,我让服务器在一个单独的线程中运行,但是它使用了大量的CPU,如何减少它使用的CPU量 这是我的服务器: Form1 main = new Form1(); try { IPAddress ipAd = IPAddress.Parse(main.ipAddress); //use local m/c IP addr

我正在尝试编写一个投票服务器和客户端,所以你启动程序,它显示投票表格,你可以对各种项目进行投票。对于服务器部分,我让服务器在一个单独的线程中运行,但是它使用了大量的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);
        }
Form1 main=new Form1();
尝试
{
IPAddress ipAd=IPAddress.Parse(main.IPAddress);//使用本地m/c IP地址,并在客户端中使用相同的地址
/*初始化侦听器*/
TcpListener myList=新的TcpListener(ipAd,55548);
/*在指定的端口开始侦听*/
myList.Start();
while(true)
{
字符串消息=”;
套接字s=myList.AcceptSocket();
if(main.users.Contains(s.RemoteEndPoint.ToString())==false)
Add(s.RemoteEndPoint.ToString());
字节[]b=新字节[500];
int k=s.Receive(b);
for(int i=0;i
我发现您有字符串连接,这基本上会影响性能;尝试使用StringBuilder-消息变量应为StringBuilder类型。

您使用的是阻塞类型的连接。由于TcpListener.AcceptConnection()的原因,您创建的循环会导致CPU开销。您的解决方案是接受非阻塞套接字连接,这是通过异步地从套接字接收数据来完成的

下面是msdn链接,解释了它是如何工作的。
while(true)
通常会引发标志:这是一个“紧循环”(又称忙循环)吗?即使没有分析器,也很容易找到燃烧100%内核的代码。只要多次使用Debug+Break,调试器就很有可能在热代码中持续中断。(a)您假设bytes==chars。这仅适用于字符集的子集。(b) 假设在一次
接收中读取了所有消息是不安全的。完全有可能一个接收调用产生的字节数比您预期的要少,需要更多的接收来读取消息的其余部分。发送没有长度指示的字符串本质上意味着不可能知道您何时收到了整个消息,除非您的协议意味着客户端立即关闭连接。在本例中,
Receive
直到返回0字节。假设
myList
是某种侦听器。你为什么要在主循环中停止它?你似乎也从来没有打破过那个while循环。。