提问者:小点点

使用process.start启动时使用高CPU的C#TCP客户端


我有一个ASP Net Core 3.1 web应用程序,它在启动时启动控制台应用程序。。。

Process p = new Process ();
p.StartInfo.FileName = Path.Combine ( env.ContentRootPath , "MyProcess" , "myprocess.exe" );
p.Start ();

启动的进程侦听TCP连接,如下所示:

while ( true )
{
     if ( theTcpListenerServer.Pending() )
     {
         Task.Run(() =>
         {
            using ( TcpClient client = theTcpListenerServer.AcceptTcpClient() )
            {
                try
                {
                    byte[] aByteArray = new byte[ client.SendBufferSize ];

                    theStream = client.GetStream()
                    int aRecv;

                    while ( true )
                    {
                        aRecv = theStream.Read(aByteArray , 0 , client.SendBufferSize);
                        aData = System.Text.Encoding.ASCII.GetString(aByteArray , 0 , aRecv);

                        if ( !string.IsNullOrEmpty(aData) )
                        {
                            RaisePackageReceivedEvent(aData);
                            break;
                        }
                    }
                }
                catch ( Exception e )
                {
                    //log some info
                }
            }
        });
    }
    Thread.Sleep(10);
}

如果我单独启动它,这个进程运行的CPU几乎为0%,但是从web应用程序启动它则需要使用30%的CPU。最初,代码没有task.run位,我还添加了thread.sleep(10)。当我调用process.start时,我也尝试重定向输出,但没有任何帮助。


共1个答案

匿名用户

在派生任务之前,您需要调用。然后在任务中处理接收到的客户端。不需要调用,这会浪费cpu周期。将做正确的事情,在阻塞和等待连接时使用最小的CPU。

不管是哪种方式,这看起来都像是你可以直接在你的web应用程序中生成一个任务。不需要另一个过程。