public async override Task <DialogTurnResult> BeginDialogAsync(DialogContext dc, object options = null, CancellationToken cancellationToken = default(CancellationToken))
        {
            if (options is CancellationToken)
            {
                throw new ArgumentException($"{nameof(options)} cannot be a cancellation token");
            }

            if (this.Disabled != null && this.Disabled.GetValue(dc.State) == true)
            {
                return(await dc.EndDialogAsync(cancellationToken : cancellationToken).ConfigureAwait(false));
            }

            //start a timer that will continue this conversation
            var timerId = Guid.NewGuid().ToString();

            CreateTimerForConversation(dc, timerId, cancellationToken);
            await stateMatrix.StartAsync(timerId).ConfigureAwait(false);

            dc.State.SetValue("this.TimerId", timerId);

            return(await base.BeginDialogAsync(dc, options, cancellationToken).ConfigureAwait(false));
        }