diff --git a/OBD.NET/OBD.NET.Common/Devices/SerialDevice.cs b/OBD.NET/OBD.NET.Common/Devices/SerialDevice.cs index 021b1bf..e4623f2 100644 --- a/OBD.NET/OBD.NET.Common/Devices/SerialDevice.cs +++ b/OBD.NET/OBD.NET.Common/Devices/SerialDevice.cs @@ -197,6 +197,8 @@ namespace OBD.NET.Common.Devices /// private async void CommandWorker() { + CancellationToken cancellationToken = _commandCancellationToken.Token; + while (!_commandCancellationToken.IsCancellationRequested) { CurrentCommand = null; @@ -206,7 +208,7 @@ namespace OBD.NET.Common.Devices try { - if (_commandQueue.TryTake(out CurrentCommand, 10, _commandCancellationToken.Token)) + if (_commandQueue.TryTake(out CurrentCommand, 10, cancellationToken)) { _queueSize--; @@ -217,24 +219,19 @@ namespace OBD.NET.Common.Devices else Connection.Write(Encoding.ASCII.GetBytes(CurrentCommand.CommandText)); - //wait for command to finish or command canceled - while (!(_commandFinishedEvent.WaitOne(50) || _commandCancellationToken.IsCancellationRequested)) - { - } + // wait for command to finish or command canceled + while (!_commandFinishedEvent.WaitOne(50)) + cancellationToken.ThrowIfCancellationRequested(); } } - catch (OperationCanceledException) { /*ignore, because it is thrown when the cancellation token is canceled*/} - - // if canceled set all commands as completed (with null result) - if (_commandCancellationToken.IsCancellationRequested) + catch (OperationCanceledException) { CurrentCommand?.CommandResult.WaitHandle.Set(); - foreach (var cmd in _commandQueue) - { - cmd.CommandResult.WaitHandle.Set(); - } } } + + foreach (QueuedCommand cmd in _commandQueue) + cmd.CommandResult.WaitHandle.Set(); } public void WaitQueue() => _queueEmptyEvent.WaitOne();