/// <summary>
        /// Custom Stream name
        /// i.e. [StreamName]
        /// </summary>
        /// <param name="streamName"></param>
        /// <param name="checkpoint"></param>
        /// <param name="blockUntilLive"></param>
        public virtual void Start(string streamName, int?checkpoint = null, bool blockUntilLive = false, int millisecondsTimeout = 1000)
        {
            _liveLock.Reset();
            lock (_startlock)
            {
                if (_started)
                {
                    throw new InvalidOperationException("Listener already started.");
                }
                if (!_subscriptionTarget.ValidateStreamName(streamName))
                {
                    throw new ArgumentException("Stream not found.", streamName);
                }

                _subscription =
                    _subscriptionTarget.SubscribeToStreamFrom(
                        streamName,
                        checkpoint ?? StreamCheckpoint.StreamStart,
                        true,
                        eventAppeared: GotEvent,
                        liveProcessingStarted: () =>
                {
                    _bus.Publish(new EventStoreMsg.CatchupSubscriptionBecameLive());
                    _liveLock.Set();
                });
                _started = true;
            }
            if (blockUntilLive)
            {
                _liveLock.Wait(millisecondsTimeout);
            }
        }