我刚刚测试了我的程序,并正在查看其进程的内存使用情况和其他内容。然后,我注意到我的 .NET 程序的 CPU 利用率几乎总是在 50% 左右,每隔一段时间它就会跳到 98% CPU。如果你运行它足够长的时间,程序就会缺乏更好的“废话”。
这正常吗?
更新:
method RemoteLink.ListenForClientConnections;
var theClient : HandleClient;
begin
// Loop and wait for client connection.
while true do
begin
//blocks until a client has connected to the server
ServerClientSock := ServerSock.AcceptTcpClient; <<== Blocking
theClient := new HandleClient;
theClient.startClient(ServerClientsock);
Invoke(new UpdateClients(UpdateTheList),theClient);
end;
end;
实际上,有问题的 while 循环线程不是上面的,而是下面的。
更新:
method TSerialIndicator.BigLoop;
begin
while true do
begin
if TurnOnTx then
begin
Thread.Sleep(50);
TxLight.BackColor := Color.Black;
TurnOnTx:=false;
end;
if TurnOnRx then
begin
Thread.Sleep(50);
RxLight.BackColor := Color.Black;
TurnOnRx:=false;
end;
end;
end;
当我的程序加载并运行时,该线程就会启动。正如您所看到的,如果我的程序没有进行通信,我的 winform 上的指示器就不会更新,因此这个循环只是循环而没有任何延迟。
最佳答案
只要有 while(true)
样式循环,无论语言或平台如何,如果不构建,都存在将单个核心固定在 100% 或接近 100% 的风险循环内容正确。在这种情况下,我怀疑您有一台双核机器,这样一个核心就可以尽可能快地工作。这会得出您问题中 50% 的数字。此外,我怀疑循环中的阻塞函数没有按您的预期工作,因此您的代码中没有任何内容可以让 cpu 休息。
您可以通过将 Thread.Sleep() 调用放入循环中来缓解该问题,但您可能知道,这可能会对您的套接字服务产生不必要的副作用,使其实际上并不始终监听连接。
关于.net - .NET 程序平均一直使用 50% 的 CPU,这正常吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14608751/