Я работаю с 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 и ставит в очередь каждый пакет.И здесь не может быть никакого перерыва.Затем я читал из очереди и прерывал этот вызов.Это бы сработало, но определенно требует определенных усилий.Я вижу следующие проблемы: безопасность и производительность потоков.
Есть ли более понятный / простой способ справиться с этой ситуацией?