我正在使用 dotnet core 2.2 并具有以下 UDP 侦听器:
var socket = new Socket(ep.AddressFamily, SocketType.Dgram, ProtocolType.Udp);
while (true)
{
var result = await socket.ReceiveFromAsync(...);
}
现在在某些情况下,我想中断ReceiveFromAsync()通话。但似乎与 TCP 案例(即ReceiveAsync())不同,没有ReceiveFromAsync()接受过载CancellationToken。
一种选择是与Task.Delay(-1, ct);一起使用Task.WhenAny()/Task.WhenAll()。但我认为这个解决方案会导致内存泄漏,对吧?我的意思是.ReceiveFromAsync()如果被打断,呼叫仍然“存在”,只是在后台。也可能导致逻辑中断,因为这样的调用会读取一个 UDP 数据包并在之后丢弃它?还是我的推理不正确?
另一个想法是让后台工作人员从 UDP 套接字读取数据并对每个数据包进行排队。并且这里不会发生中断。然后我会从队列中读取并中断这个呼叫。这会奏效,但肯定需要一些努力。我看到的问题是:线程安全和性能。
有没有更清洁/更简单的方法来处理这种情况?
墨色风雨
相关分类