【发布时间】:2020-12-31 14:50:51
【问题描述】:
我有一个 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);
}
如果我独立启动此进程,它几乎会在 0% 的 CPU 上运行,但从 Web 应用程序启动它会占用 30% 的 CPU。最初代码没有 Task.Run 位,我还添加了 Thread.Sleep(10)。当我调用 Process.Start 时,我也尝试重定向输出,但没有任何帮助。
【问题讨论】:
-
我不是这方面的专家,但 while(true) 是 CPU 的敌人。
-
@MonkeyDLuffy 当我在其他答案中阅读时,这就是 Thread.Sleep(10) 应该提供帮助的地方。但这并不能解释从 exe 或使用 Process.Start() 启动它的区别,对吧?
-
你在什么时候等待任务
-
@Charlieface 我没有,但实际上它永远不会达到那个点,因为当没有建立连接时会发生这种情况(即,Pending() 总是错误的)
标签: c# asp.net asp.net-core