-
-
Notifications
You must be signed in to change notification settings - Fork 47
Closed
Crequency/KitX-Dashboard
#25Labels
bugSomething isn't workingSomething isn't workingfixedThis problem has been fixedThis problem has been fixed
Description
Discussed in #258
经过初步检查, 初步判定并不是代码编写逻辑的问题, 而是 TcpListener.Pending 方法占用 CPU 资源过多, 相关代码如下:
Network/DevicesServer.cs
/// <summary>
/// 接收客户端
/// </summary>
private static void AcceptClient()
{
var location = $"{nameof(DevicesServer)}.{nameof(AcceptClient)}";
try
{
while (keepListen && listener is not null)
{
if (listener.Pending()) // <- HERE
{
var client = listener.AcceptTcpClient();
if (client.Client.RemoteEndPoint is not IPEndPoint endpoint) continue;
clients.Add(endpoint.ToString(), client);
Log.Information($"New device connection: {endpoint}");
ReceiveMessage(client);
}
}
}
catch (Exception ex)
{
Log.Error(ex, $"In {nameof(location)}: {ex.Message}");
Status = ServerStatus.Errored;
}
} /// <summary>
/// 接收客户端
/// </summary>
private null void AcceptClient()
{
var location = $"{nameof(PluginsServer)}.{nameof(AcceptClient)}";
try
{
while (keepListen && listener is not null)
{
if (listener.Pending()) // <- HERE
{
var client = listener.AcceptTcpClient();
if (client.Client.RemoteEndPoint is not IPEndPoint endpoint) continue;
clients.Add(endpoint.ToString(), client);
Log.Information($"New plugin connection: {endpoint}");
ReceiveMessage(client);
}
}
}
catch (Exception ex)
{
Log.Error(ex, $"In {location}: {ex.Message}");
Status = ServerStatus.Errored;
}
}占用情况如图. 基本上占用一半的资源, 另一半则是 sockets 库
修改建议为适当增加线程休眠时间, 如:
Thread.Sleep(500);
Metadata
Metadata
Assignees
Labels
bugSomething isn't workingSomething isn't workingfixedThis problem has been fixedThis problem has been fixed
Type
Projects
Status
Done
