private async Task Loop() { var dispatchQueue = new DispatchQueue <UdpReceiveResult>((result) => { var buffer = DataBuffer.Wrap(result.Buffer); var header = RtpPacketHeader.ReadFrom(buffer); try { OnPacket?.Invoke(new RtpPacket(buffer.Subset(header.CalculateHeaderLength()), header.SequenceNumber, header.Timestamp, header.Marker) { PayloadType = header.PayloadType, SynchronizationSource = header.SynchronizationSource }); } catch (Exception ex) { Console.Error.WriteLine($"Unexpected exception raising packet. {ex}"); } }); while (_LoopActive) { try { dispatchQueue.Enqueue(await _Server.ReceiveAsync()); } catch (ObjectDisposedException) { break; } } dispatchQueue.WaitForDrain(); dispatchQueue.Destroy(); }