コード例 #1
0
 public async Task ProduceMessagesAsync()
 {
     try
     {
         await Task.Run(ProduceMessages);
     }
     catch (Exception ex)
     {
         ExceptionHandler.Handle(ex);
     }
 }
コード例 #2
0
        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);
                }
            }
        }