C#TCP客户端在与Process.Start一起启动时使用高CPU
我有一个ASP Net Core 3.1 web应用程序,它在启动时启动一个控制台应用程序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
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本机代码,并且我必须跨平台维护通用应用程序。