Итак, у меня есть куча разных портов, которые я хочу прослушивать, и перебирать доступные данные для отправки в конвейер потока данных. В целом я слушаю 14 портов. Ищите любые советы о том, как уменьшить использование процессора в следующем коде.Высокий udpclient cpu использует
Так что я просто проездом в портах к способу затем добавить их в список
public static void AddPorts(Dictionary<int,string> ports)
{
try
{
var NewEndPoints = new List<IPEndPoint>();
foreach (var port in ports)
{
var endpoint = new IPEndPoint(IPAddress.Any, port.Key);
NewEndPoints.Add(endpoint);
if (!Endpoints.Contains(endpoint))
{
Endpoints.Add(endpoint);
var client = new UdpClient(endpoint);
logger.Info("New Client added on port: {0}", endpoint.Port);
Clients.Add(client);
}
else
{
if (IgnoredPorts.Contains(endpoint.Port))
{
logger.Info("Existing client enabled on port: {0}", endpoint.Port);
IgnoredPorts.Remove(port.Key);
}
}
}
var differences = Endpoints.Except(NewEndPoints);
differences.ToList().ForEach(d =>
{
if (!IgnoredPorts.Contains(d.Port))
{
IgnoredPorts.Add(d.Port);
logger.Info("Client removed on port: {0}", d.Port);
}
});
}
catch (Exception ex)
{
logger.Error("Error creating udpclients", ex);
}
}
Я тогда пошаговый просмотр всех доступных данных
Task.Run(async delegate
{
while (Receive)
{
try
{
// get any channels that have data availble
// Iterate over the the channels and send to Dataflow pipeline
var readyChannels =
(from channel in Clients
where channel.Available > 0 && !ListenersDF.IgnoredPorts.Contains(((IPEndPoint)channel.Client.LocalEndPoint).Port)
select channel);
// Iterate over the the channels and send to Dataflow pipeline
foreach (var channel in readyChannels)
{
// await on the result of the task
await ReceiveAndRespond(channel);
}
}
catch (Exception ex)
{
logger.Error("Error sending packet to bufferBlock", ex);
}
}
});
И, наконец, отправить его в поток данных pipline
async Task ReceiveAndRespond(UdpClient channel)
{
UdpReceiveResult? result = null;
try
{
result = await channel.ReceiveAsync();
}
catch (Exception exc)
{
logger.Error("Error receiving from channel: " + exc.Message, exc);
}
if (result != null)
{
var device = (from d in Ports
where d.Key == ((IPEndPoint)channel.Client.LocalEndPoint).Port
select d.Value).FirstOrDefault();
UdpData data = new UdpData() { Client = channel, Data = result.Value.Buffer, LocalPort = ((IPEndPoint)channel.Client.LocalEndPoint).Port, LocalIP = ((IPEndPoint)channel.Client.LocalEndPoint).Address, RemoteEndpoint = result.Value.RemoteEndPoint, Device = device };
Flow.bufferBlock.Post(data);
// for testing logs the hex string to a log file
//logger.Warn(string.Format("Data received on port: {0} for device: {1} with data: {2}", data.LocalPort, data.Device, data.Data.ByteArrayToHexString()));
}
}
Тогда cpu сидит на 50% с трудом и трафиком, и я уверен, что что-то случилось о том, как я это делаю. Любая помощь очень ценится!
В цикле 'в то время (Receive)', вы проверяете и проверить и проверить 'где channel.Available> 0', принимая во внимание скорость CPU, вы в основном проверяете, не делая ничего. – EZI
Любой лучший способ получить данные из каналов с данными, готовыми к приему? – Jesse