public async Task ProduceMessagesAsync() { try { await Task.Run(ProduceMessages); } catch (Exception ex) { ExceptionHandler.Handle(ex); } }
private void ProduceMessages() { using var udpClient = new UdpClient(_options.Port, AddressFamily.InterNetwork); #if DEBUG Task.Run(() => { while (true) { Console.WriteLine($"Available packages on {DateTime.Now:T}: {udpClient.Available}"); Thread.Sleep(1000); } }); #endif var address = IPAddress.Parse(_options.IpAddress); udpClient.JoinMulticastGroup(address); var previousMessageNumber = long.MinValue; while (true) { if (_hold > 0) { _resetEvent.WaitOne(); } try { IPEndPoint remoteIp = null; byte[] data = udpClient.Receive(ref remoteIp); using var stream = new MemoryStream(data); var message = Serializer.Deserialize <Message>(stream); _cache.Add(message.Value); if (previousMessageNumber + 1 != message.SequenceNumber) { Interlocked.Increment(ref _lossPackagesCount); } previousMessageNumber = message.SequenceNumber; } catch (Exception e) { ExceptionHandler.Handle(e); } } }