ПОЧЕМУ мое использование процессора достигает 99%, когда мое приложение C # начинает прослушивать сокет tcp? - PullRequest
0 голосов
/ 06 марта 2012

Я создал приложение для прослушивания сокета TCP. Когда я запускаю свою программу, загрузка процессора увеличивается до 99%

        NetworkStream nStream = tcpClient.GetStream();
        ASCIIEncoding ascii = null;
        while (!stopRecieving)
        {
            Thread.Sleep(500);
            if (nStream.CanRead)
            {
                byte[] buffer = new byte[800000];
                nStream.Read(buffer, 0, buffer.Length);
                ascii = new ASCIIEncoding();
                recvDt = ascii.GetString(buffer);
                //       --++ Normal msg
                if (recvDt.Contains("--++"))
                {
                    string d = "--++";
                    recvDt = recvDt.TrimStart(d.ToCharArray());


                    obj.SetSomeLab(recvDt, port );

                }
            }
            Thread.Sleep(1000);
        }

Если кто-нибудь подскажет, как уменьшить загрузку процессора? С уважением,

1 Ответ

1 голос
/ 06 марта 2012

другим подходом будет использование асинхронного шаблона:

public void StartListening() {
    IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName());
    IPEndPoint localEP = new IPEndPoint(ipHostInfo.AddressList[0],11000);

    Console.WriteLine("Local address and port : {0}",localEP.ToString());

    Socket listener = new Socket( localEP.Address.AddressFamily,
        SocketType.Stream, ProtocolType.Tcp );

    try {
        listener.Bind(localEP);
        listener.Listen(10);

        while (true) {
            allDone.Reset();

            Console.WriteLine("Waiting for a connection...");
            listener.BeginAccept(
                new AsyncCallback(SocketListener.acceptCallback), 
                listener );

            allDone.WaitOne();
        }
    } catch (Exception e) {
        Console.WriteLine(e.ToString());
    }

    Console.WriteLine( "Closing the listener...");
}

public void acceptCallback(IAsyncResult ar) {
    allDone.Set();

    Socket listener = (Socket) ar.AsyncState;
    Socket handler = listener.EndAccept(ar);

    // Additional code to read data goes here.  
}

, см. Больше здесь: http://msdn.microsoft.com/en-us/library/5w7b7x5f.aspx

...