public void can_cancel_while_processing()
        {
            _bus.Subscribe <TestTokenCancellableLongRunningCmd>(this);
            _tokenSource = new CancellationTokenSource();
            var cmd = new TestTokenCancellableLongRunningCmd(false, _tokenSource.Token);

            _bus.TrySendAsync(cmd);
            AssertEx.IsOrBecomesTrue(() => Interlocked.Read(ref _gotCmd) == 1, msg: "Command not handled");
            AssertEx.IsOrBecomesTrue(() => Interlocked.Read(ref _canceled) == 1, msg: "Command not canceled");
        }
        public CommandResponse Handle(TestTokenCancellableLongRunningCmd command)
        {
            Interlocked.Exchange(ref _gotCmd, 1);
            _tokenSource.Cancel();
            SpinWait.SpinUntil(() => command.IsCanceled, 500);


            if (command.IsCanceled)
            {
                Interlocked.Exchange(ref _canceled, 1);
                return(command.Fail());
            }
            else
            {
                Interlocked.Exchange(ref _success, 1);
                return(command.Succeed());
            }
        }