private void PollForMessages()
        {
            while (!_stopped)
            {
                try
                {
                    var result  = _consumer.Value.Consume(_disposeSource.Token);
                    var message = new KafkaReceiverMessage(_consumer.Value, result, EnableAutoOffsetStore);

                    if (_connected != true)
                    {
                        _connected = true;
                        OnConnected();
                    }

                    var task = MessageHandler.OnMessageReceivedAsync(this, message);
                    _trackingCollection.Add(task);
                }
                catch (OperationCanceledException) when(_disposeSource.IsCancellationRequested)
                {
                    return;
                }
                catch (Exception ex)
                {
                    OnError("Error in polling loop.", ex);
                    // TODO: Delay the loop?
                }
            }
        }
        /// <summary>
        /// Replays messages.
        /// </summary>
        protected virtual async Task Replay(IConsumer <string, byte[]> consumer,
                                            List <TopicPartitionOffset> startOffsets, DateTime endTimestamp,
                                            Func <IReceiverMessage, Task> callback, bool enableAutoOffsetStore)
        {
            consumer.Assign(startOffsets);

            var partitionsFinished = new bool[startOffsets.Count];

            while (true)
            {
                var result = consumer.Consume(TimeSpan.FromSeconds(5));
                if (result is null)
                {
                    return;
                }

                var afterEndTimestamp = false;

                for (int i = 0; i < startOffsets.Count; i++)
                {
                    if (result.TopicPartition == startOffsets[i].TopicPartition &&
                        result.Message.Timestamp.UtcDateTime > endTimestamp)
                    {
                        afterEndTimestamp = partitionsFinished[i] = true;
                        break;
                    }
                }

                if (partitionsFinished.All(finished => finished is true))
                {
                    return;
                }

                if (afterEndTimestamp)
                {
                    continue;
                }

                var message = new KafkaReceiverMessage(consumer, result, enableAutoOffsetStore);
                try { await callback(message); }
                catch { /* TODO: Something? */ }
            }
        }