private async void ProcessCommandQueue()
        {
            await Task.Run(async() =>
            {
                var spinWait = new SpinWait();
                while (true)
                {
                    try
                    {
                        if (!_commands.IsEmpty && _commands.TryDequeue(out var command))
                        {
                            var request  = new TelloRequest(command);
                            var response = new TelloResponse(await _transceiver.SendAsync(request));

                            Debug.WriteLine($"{nameof(ProcessCommandQueue)}: len: {_commands.Count}, msg: '{request.Message}', timeout {request.Timeout}, success '{response.Success}', resp msg '{response.Message}'");

                            if (command.Rule.Response != Responses.None)
                            {
                                ReponseReceived(response);
                            }
                        }
                        else
                        {
                            spinWait.SpinOnce();
                        }
                    }
                    catch (Exception ex)
                    {
                        ExceptionThrown(ex);
                    }
                }
            });
        }
        private async void ProcessCommandQueueAsync()
        {
            await Task.Run(async() =>
            {
                var spinWait = default(SpinWait);
                while (true)
                {
                    try
                    {
                        if (!this.commands.IsEmpty && this.commands.TryDequeue(out var command))
                        {
                            Debug.WriteLine($"{nameof(this.ProcessCommandQueueAsync)}: command queue is {this.commands.Count} deep.");

                            var request = new TelloRequest(command);
                            Debug.WriteLine($"{nameof(this.ProcessCommandQueueAsync)}: request.Message '{request.Message}'");
                            Debug.WriteLine($"{nameof(this.ProcessCommandQueueAsync)}: request.Timeout '{request.Timeout}'");

                            var response = new TelloResponse(await this.transceiver.SendAsync(request));
                            Debug.WriteLine($"{nameof(this.ProcessCommandQueueAsync)}: response.Success '{response.Success}'");
                            Debug.WriteLine($"{nameof(this.ProcessCommandQueueAsync)}: response.Message '{response.Message}'");

                            this.ReponseReceived(response);
                        }
                        else
                        {
                            spinWait.SpinOnce();
                        }
                    }
                    catch (Exception ex)
                    {
                        this.ExceptionThrown(ex);
                    }
                }
            });
        }