等待队列中消息的 UDP 发送任务将耗尽 CPU



>我正在执行一个 udp 发送程序例程,该例程等待队列中的消息,然后将它们发送到所有配置的侦听器端口(此处简化了代码(。

为此,我创建了一个 UDPClient 来处理任务内的队列。

我已经使用取消令牌将代码放入 WHILE TRUE 中退出,并且在每次往返时我都在检查队列是否包含某些内容,否则下一个循环......

这确实消耗了 CPU。我能够在每个周期添加 Thread.Sleep 来减少它,但是当我需要在短时间内发送多个数据包并且它们不是在同一毫秒内到达时,这会减慢进程。

有没有一种方法可以继续监视队列提升中的元素,这些元素将保留在循环循环内而不会在其上连续运行?

Task.Run(async () =>
{
using (var udpClient = new UdpClient(AddressFamily.InterNetwork))
{
udpClient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
while (true)
{
Thread.Sleep(100); //This will save 30% CPU
while (UdpOutboundMessageQueue.Count > 0)
{
if (UdpOutboundMessageQueue.TryDequeue(out Tuple<NetworkOutboundMessageTypeEnum, string> dequeueResult))
{
byte[] byteMessage = Encoding.ASCII.GetBytes(dequeueResult.Item2);
await udpClient.SendAsync(byteMessage, byteMessage.Length, dequeueResult.Item1);
}
}
}
}
});

您可以使用 SemaphoreSlim 类的对象,该类具有可以在异步代码中使用的 WaitAsync 方法。 https://learn.microsoft.com/en-us/dotnet/api/system.threading.semaphoreslim?view=net-5.0

或者,可以使用具有 BufferBlock 类的 TPL NuGet 包,该类可用于等待缓冲区排队。 https://learn.microsoft.com/en-us/dotnet/standard/parallel-programming/task-parallel-library-tpl

最新更新