C#TCP客户端在与Process.Start一起启动时使用高CPU

C#TCP客户端在与Process.Start一起启动时使用高CPU,c#,asp.net,asp.net-core,C#,Asp.net,Asp.net Core,我有一个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 ( theT

我有一个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时,我也尝试重定向输出,但没有任何帮助。

在生成任务之前,您可能希望调用
TheCPListenerServer.AcceptCpcClient()
。然后在任务中处理接收到的客户机。无需调用CPListenerServer.Pending(),这将浪费cpu周期
AcceptCpcClient
将在阻塞和等待连接时执行正确的操作并使用最少的CPU


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

在我做了很多尝试后,错误出现在代码的另一部分(在web应用程序中)。我在做以下工作:

using (TcpClient client = new TcpClient("localhost", port)){
    JObject jsonObj = myObj.ToJSON(); // can return null if error
    if(jsonObj == null) return false;

    // rest of operations
}
出于某种原因,打开TCP客户端而不做任何事情是失败的(可能它在第二次运行时挂起了(对),但我不确定)

在移动代码后,它看起来像这样

JObject jsonObj = myObj.ToJSON(); // can return null if error
if(jsonObj == null) return false;

using (TcpClient client = new TcpClient("localhost", port)){
    // rest of operations
}

它可以完美地处理应该工作的对象,并且在JSON为null时不会打开空的TCP客户端。

我不是这方面的专家,但(true)是cpu的敌人。@MonkeyDLuffy这就是线程的所在。Sleep(10)应该在阅读其他答案时有所帮助。但这并不能解释从exe或使用Process.Start()启动它的区别,对吗?在什么时候等待Task@Charlieface我不知道,但实际上它永远不会达到那个点,因为这是在没有连接的情况下发生的(即,Pending()总是false),谢谢您的回复!实际上,我添加了待定项,但它是像您之前所说的那样编写的(并且不起作用)。然而,问题最终出现在另一个地方(稍后我将补充一个答案)。我必须在另一个进程中完成,因为它使用了一些我无法控制的Windows本机代码,并且我必须跨平台维护通用应用程序。