From 163f5eb3a3c123a605d509ffbb9158c41ff4e0de Mon Sep 17 00:00:00 2001 From: Darth Affe Date: Mon, 2 May 2022 21:59:20 +0200 Subject: [PATCH] Fixed uses of nullable reference types --- OBD.NET/ConsoleClient/Program.cs | 22 ++++++------ .../BluetoothSerialConnection.cs | 1 - .../Properties/AssemblyInfo.cs | 1 - OBD.NET/OBD.NET/Commands/ATCommand.cs | 4 +-- .../OBD.NET/Communication/SerialConnection.cs | 10 ++---- OBD.NET/OBD.NET/DataTypes/Count.cs | 2 +- OBD.NET/OBD.NET/DataTypes/Degree.cs | 2 +- OBD.NET/OBD.NET/DataTypes/DegreeCelsius.cs | 2 +- OBD.NET/OBD.NET/DataTypes/GenericData.cs | 2 +- OBD.NET/OBD.NET/DataTypes/Ratio.cs | 2 +- OBD.NET/OBD.NET/Devices/CommandResult.cs | 2 +- OBD.NET/OBD.NET/Devices/ELM327.cs | 34 ++++++++---------- OBD.NET/OBD.NET/Devices/STN1170.cs | 2 +- OBD.NET/OBD.NET/Devices/SerialDevice.cs | 35 ++++++++++--------- .../OBD.NET/Events/GenericDataEventManager.cs | 2 +- .../OBDData/00-1F/CalculatedEngineLoad.cs | 2 +- .../OBDData/40-5F/AbsoluteLoadValue.cs | 2 +- OBD.NET/OBD.NET/OBDData/AbstractOBDData.cs | 2 +- OBD.NET/OBD.NET/Util/AsyncManulResetEvent.cs | 7 ++-- 19 files changed, 63 insertions(+), 73 deletions(-) diff --git a/OBD.NET/ConsoleClient/Program.cs b/OBD.NET/ConsoleClient/Program.cs index 08db7cb..5142569 100644 --- a/OBD.NET/ConsoleClient/Program.cs +++ b/OBD.NET/ConsoleClient/Program.cs @@ -21,9 +21,7 @@ public class Program Console.WriteLine("\nAvailable ports:"); foreach (string port in availablePorts) - { Console.WriteLine(port); - } return; } @@ -33,10 +31,10 @@ public class Program using SerialConnection connection = new(comPort); using ELM327 dev = new(connection, new OBDConsoleLogger(OBDLogLevel.Debug)); - dev.SubscribeDataReceived((sender, data) => Console.WriteLine("EngineRPM: " + data.Data.Rpm)); - dev.SubscribeDataReceived((sender, data) => Console.WriteLine("VehicleSpeed: " + data.Data)); + dev.SubscribeDataReceived((_, data) => Console.WriteLine("EngineRPM: " + data.Data.Rpm)); + dev.SubscribeDataReceived((_, data) => Console.WriteLine("VehicleSpeed: " + data.Data)); - dev.SubscribeDataReceived((sender, data) => Console.WriteLine($"PID {data.Data.PID.ToHexString()}: {data.Data}")); + dev.SubscribeDataReceived((_, data) => Console.WriteLine($"PID {data.Data.PID.ToHexString()}: {data.Data}")); dev.Initialize(); dev.RequestData(); @@ -66,18 +64,18 @@ public class Program using SerialConnection connection = new(comPort); using ELM327 dev = new(connection, new OBDConsoleLogger(OBDLogLevel.Debug)); - dev.Initialize(); + await dev.InitializeAsync(); - EngineRPM engineRpm = await dev.RequestDataAsync(); - Console.WriteLine("Data: " + engineRpm.Rpm); + EngineRPM? engineRpm = await dev.RequestDataAsync(); + Console.WriteLine("Data: " + (engineRpm?.Rpm.ToString() ?? "-")); engineRpm = await dev.RequestDataAsync(); - Console.WriteLine("Data: " + engineRpm.Rpm); + Console.WriteLine("Data: " + (engineRpm?.Rpm.ToString() ?? "-")); - VehicleSpeed vehicleSpeed = await dev.RequestDataAsync(); - Console.WriteLine("Data: " + vehicleSpeed.Speed); + VehicleSpeed? vehicleSpeed = await dev.RequestDataAsync(); + Console.WriteLine("Data: " + (vehicleSpeed?.Speed.ToString() ?? "-")); engineRpm = await dev.RequestDataAsync(); - Console.WriteLine("Data: " + engineRpm.Rpm); + Console.WriteLine("Data: " + (engineRpm?.Rpm.ToString() ?? "-")); } } \ No newline at end of file diff --git a/OBD.NET/OBD.NET.Universal/Communication/BluetoothSerialConnection.cs b/OBD.NET/OBD.NET.Universal/Communication/BluetoothSerialConnection.cs index 9f9080c..c6ea7c1 100644 --- a/OBD.NET/OBD.NET.Universal/Communication/BluetoothSerialConnection.cs +++ b/OBD.NET/OBD.NET.Universal/Communication/BluetoothSerialConnection.cs @@ -46,7 +46,6 @@ namespace OBD.NET.Communication /// Initializes a new instance of the class. /// /// Name of the _device. - /// The logger. public BluetoothSerialConnection(string deviceName) { this._device = deviceName; diff --git a/OBD.NET/OBD.NET.Universal/Properties/AssemblyInfo.cs b/OBD.NET/OBD.NET.Universal/Properties/AssemblyInfo.cs index 483f8d8..1b60af7 100644 --- a/OBD.NET/OBD.NET.Universal/Properties/AssemblyInfo.cs +++ b/OBD.NET/OBD.NET.Universal/Properties/AssemblyInfo.cs @@ -1,5 +1,4 @@ using System.Reflection; -using System.Runtime.CompilerServices; using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following diff --git a/OBD.NET/OBD.NET/Commands/ATCommand.cs b/OBD.NET/OBD.NET/Commands/ATCommand.cs index 339dbe7..d6a6c3c 100644 --- a/OBD.NET/OBD.NET/Commands/ATCommand.cs +++ b/OBD.NET/OBD.NET/Commands/ATCommand.cs @@ -28,13 +28,13 @@ public class ATCommand #region Properties & Fields public string Command { get; } - public string ExpectedResult { get; } + public string? ExpectedResult { get; } #endregion #region Constructors - private ATCommand(string command, string expectedResult = null) + private ATCommand(string command, string? expectedResult = null) { this.Command = command; this.ExpectedResult = expectedResult; diff --git a/OBD.NET/OBD.NET/Communication/SerialConnection.cs b/OBD.NET/OBD.NET/Communication/SerialConnection.cs index 4a5a619..8f0c8e1 100644 --- a/OBD.NET/OBD.NET/Communication/SerialConnection.cs +++ b/OBD.NET/OBD.NET/Communication/SerialConnection.cs @@ -1,7 +1,6 @@ #if NET5_0_OR_GREATER using System.IO.Ports; -using System.Text; using OBD.NET.Communication.EventArgs; namespace OBD.NET.Communication; @@ -12,19 +11,16 @@ public class SerialConnection : ISerialConnection private readonly SerialPort _serialPort; - public bool IsOpen => _serialPort?.IsOpen ?? false; + public bool IsOpen => _serialPort.IsOpen; public bool IsAsync => false; private readonly byte[] _readBuffer = new byte[1024]; - private readonly StringBuilder _lineBuffer = new(); - - private readonly AutoResetEvent _hasPrompt = new(true); #endregion #region Events - public event EventHandler DataReceived = delegate { }; + public event EventHandler? DataReceived = delegate { }; #endregion @@ -61,7 +57,7 @@ public class SerialConnection : ISerialConnection DataReceived?.Invoke(this, new DataReceivedEventArgs(count, _readBuffer)); } - public void Dispose() => _serialPort?.Dispose(); + public void Dispose() => _serialPort.Dispose(); public Task ConnectAsync() => throw new NotSupportedException("Asynchronous operations not supported"); diff --git a/OBD.NET/OBD.NET/DataTypes/Count.cs b/OBD.NET/OBD.NET/DataTypes/Count.cs index 0d0a9c9..d29c4f1 100644 --- a/OBD.NET/OBD.NET/DataTypes/Count.cs +++ b/OBD.NET/OBD.NET/DataTypes/Count.cs @@ -4,7 +4,7 @@ public class Count : GenericData { #region Properties & Fields - protected override string Unit => null; + protected override string? Unit => null; #endregion diff --git a/OBD.NET/OBD.NET/DataTypes/Degree.cs b/OBD.NET/OBD.NET/DataTypes/Degree.cs index 826d82d..0d04008 100644 --- a/OBD.NET/OBD.NET/DataTypes/Degree.cs +++ b/OBD.NET/OBD.NET/DataTypes/Degree.cs @@ -22,7 +22,7 @@ public class Degree : GenericData #region Methods - public override string ToString() => (IsFloatingPointValue ? Value.ToString("0.00") : Value.ToString()) + (Unit ?? string.Empty); + public override string ToString() => (IsFloatingPointValue ? Value.ToString("0.00") : Value.ToString()) + Unit; #endregion } \ No newline at end of file diff --git a/OBD.NET/OBD.NET/DataTypes/DegreeCelsius.cs b/OBD.NET/OBD.NET/DataTypes/DegreeCelsius.cs index 23abf7c..f548fae 100644 --- a/OBD.NET/OBD.NET/DataTypes/DegreeCelsius.cs +++ b/OBD.NET/OBD.NET/DataTypes/DegreeCelsius.cs @@ -22,7 +22,7 @@ public class DegreeCelsius : GenericData #region Methods - public override string ToString() => (IsFloatingPointValue ? Value.ToString("0.00") : Value.ToString()) + (Unit ?? string.Empty); + public override string ToString() => (IsFloatingPointValue ? Value.ToString("0.00") : Value.ToString()) + Unit; #endregion } \ No newline at end of file diff --git a/OBD.NET/OBD.NET/DataTypes/GenericData.cs b/OBD.NET/OBD.NET/DataTypes/GenericData.cs index 0fb1ab7..e04191b 100644 --- a/OBD.NET/OBD.NET/DataTypes/GenericData.cs +++ b/OBD.NET/OBD.NET/DataTypes/GenericData.cs @@ -9,7 +9,7 @@ public abstract class GenericData public double MaxValue { get; } public bool IsFloatingPointValue { get; } - protected abstract string Unit { get; } + protected abstract string? Unit { get; } #endregion diff --git a/OBD.NET/OBD.NET/DataTypes/Ratio.cs b/OBD.NET/OBD.NET/DataTypes/Ratio.cs index 3e3d079..2c66d1d 100644 --- a/OBD.NET/OBD.NET/DataTypes/Ratio.cs +++ b/OBD.NET/OBD.NET/DataTypes/Ratio.cs @@ -4,7 +4,7 @@ public class Ratio : GenericData { #region Properties & Fields - protected override string Unit => null; + protected override string? Unit => null; #endregion diff --git a/OBD.NET/OBD.NET/Devices/CommandResult.cs b/OBD.NET/OBD.NET/Devices/CommandResult.cs index c32b60b..959955b 100644 --- a/OBD.NET/OBD.NET/Devices/CommandResult.cs +++ b/OBD.NET/OBD.NET/Devices/CommandResult.cs @@ -6,7 +6,7 @@ public class CommandResult { #region Properties & Fields - public object Result { get; set; } + public object? Result { get; set; } public AsyncManualResetEvent WaitHandle { get; } #endregion diff --git a/OBD.NET/OBD.NET/Devices/ELM327.cs b/OBD.NET/OBD.NET/Devices/ELM327.cs index ecbfab2..ba9733f 100644 --- a/OBD.NET/OBD.NET/Devices/ELM327.cs +++ b/OBD.NET/OBD.NET/Devices/ELM327.cs @@ -21,7 +21,7 @@ public class ELM327 : SerialDevice protected Mode Mode { get; set; } = Mode.ShowCurrentData; //TODO DarthAffe 26.06.2016: Implement different modes - protected string MessageChunk { get; set; } + protected string MessageChunk { get; set; } = string.Empty; #endregion @@ -30,13 +30,13 @@ public class ELM327 : SerialDevice public delegate void DataReceivedEventHandler(object sender, DataReceivedEventArgs args) where T : IOBDData; public delegate void RawDataReceivedEventHandler(object sender, RawDataReceivedEventArgs args); - public event RawDataReceivedEventHandler RawDataReceived; + public event RawDataReceivedEventHandler? RawDataReceived; #endregion #region Constructors - public ELM327(ISerialConnection connection, IOBDLogger logger = null) + public ELM327(ISerialConnection connection, IOBDLogger? logger = null) : base(connection, logger: logger) { } @@ -124,7 +124,7 @@ public class ELM327 : SerialDevice /// /// /// - public virtual async Task RequestDataAsync() + public virtual async Task RequestDataAsync() where T : class, IOBDData, new() { Logger?.WriteLine("Requesting Type " + typeof(T).Name + " ...", OBDLogLevel.Debug); @@ -135,9 +135,8 @@ public class ELM327 : SerialDevice /// /// Requests the data asynchronous and return the data when available /// - /// /// - public virtual async Task RequestDataAsync(Type type) + public virtual async Task RequestDataAsync(Type type) { Logger?.WriteLine("Requesting Type " + type.Name + " ...", OBDLogLevel.Debug); byte pid = ResolvePid(type); @@ -148,7 +147,7 @@ public class ELM327 : SerialDevice /// Request data based on a pid /// /// The pid of the requested data - public virtual async Task RequestDataAsync(byte pid) + public virtual async Task RequestDataAsync(byte pid) { Logger?.WriteLine("Requesting PID " + pid.ToString("X2") + " ...", OBDLogLevel.Debug); CommandResult result = SendCommand(((byte)Mode).ToString("X2") + pid.ToString("X2")); @@ -157,10 +156,8 @@ public class ELM327 : SerialDevice return result.Result; } - protected override object ProcessMessage(string message) + protected override object? ProcessMessage(string message) { - if (message == null) return null; - DateTime timestamp = DateTime.Now; RawDataReceived?.Invoke(this, new RawDataReceivedEventArgs(message, timestamp)); @@ -177,7 +174,7 @@ public class ELM327 : SerialDevice else if (message[0] == '1') { string fullMessage = MessageChunk + message.Substring(2, message.Length - 2); - MessageChunk = null; + MessageChunk = string.Empty; return ProcessMessage(fullMessage); } } @@ -187,15 +184,15 @@ public class ELM327 : SerialDevice if (mode == (byte)Mode) { byte pid = (byte)message.Substring(2, 2).GetHexVal(); - if (DataTypeCache.TryGetValue(pid, out Type dataType)) + if (DataTypeCache.TryGetValue(pid, out Type? dataType)) { - IOBDData obdData = (IOBDData)Activator.CreateInstance(dataType); + IOBDData obdData = (IOBDData)Activator.CreateInstance(dataType)!; obdData.Load(message.Substring(4, message.Length - 4)); - if (DataReceivedEventHandlers.TryGetValue(dataType, out IDataEventManager dataEventManager)) + if (DataReceivedEventHandlers.TryGetValue(dataType, out IDataEventManager? dataEventManager)) dataEventManager.RaiseEvent(this, obdData, timestamp); - if (DataReceivedEventHandlers.TryGetValue(typeof(IOBDData), out IDataEventManager genericDataEventManager)) + if (DataReceivedEventHandlers.TryGetValue(typeof(IOBDData), out IDataEventManager? genericDataEventManager)) genericDataEventManager.RaiseEvent(this, obdData, timestamp); return obdData; @@ -223,8 +220,7 @@ public class ELM327 : SerialDevice protected virtual byte AddToPidCache(Type obdDataType) { - IOBDData data = (IOBDData)Activator.CreateInstance(obdDataType); - if (data == null) throw new ArgumentException("Has to implement IOBDData", nameof(obdDataType)); + if (Activator.CreateInstance(obdDataType) is not IOBDData data) throw new ArgumentException("Has to implement IOBDData", nameof(obdDataType)); byte pid = data.PID; @@ -267,7 +263,7 @@ public class ELM327 : SerialDevice public void SubscribeDataReceived(DataReceivedEventHandler eventHandler) where T : IOBDData { - if (!DataReceivedEventHandlers.TryGetValue(typeof(T), out IDataEventManager eventManager)) + if (!DataReceivedEventHandlers.TryGetValue(typeof(T), out IDataEventManager? eventManager)) DataReceivedEventHandlers.Add(typeof(T), (eventManager = new GenericDataEventManager())); ((GenericDataEventManager)eventManager).DataReceived += eventHandler; @@ -275,7 +271,7 @@ public class ELM327 : SerialDevice public void UnsubscribeDataReceived(DataReceivedEventHandler eventHandler) where T : IOBDData { - if (DataReceivedEventHandlers.TryGetValue(typeof(T), out IDataEventManager eventManager)) + if (DataReceivedEventHandlers.TryGetValue(typeof(T), out IDataEventManager? eventManager)) ((GenericDataEventManager)eventManager).DataReceived -= eventHandler; } diff --git a/OBD.NET/OBD.NET/Devices/STN1170.cs b/OBD.NET/OBD.NET/Devices/STN1170.cs index 4328a01..4729d21 100644 --- a/OBD.NET/OBD.NET/Devices/STN1170.cs +++ b/OBD.NET/OBD.NET/Devices/STN1170.cs @@ -8,7 +8,7 @@ public class STN1170 : ELM327 // Fully compatible device { #region Constructors - public STN1170(ISerialConnection connection, IOBDLogger logger = null) + public STN1170(ISerialConnection connection, IOBDLogger? logger = null) : base(connection, logger) { } diff --git a/OBD.NET/OBD.NET/Devices/SerialDevice.cs b/OBD.NET/OBD.NET/Devices/SerialDevice.cs index 6eabdbe..0735a7b 100644 --- a/OBD.NET/OBD.NET/Devices/SerialDevice.cs +++ b/OBD.NET/OBD.NET/Devices/SerialDevice.cs @@ -17,16 +17,16 @@ public abstract class SerialDevice : IDisposable private readonly BlockingCollection _commandQueue = new(); private readonly StringBuilder _lineBuffer = new(); private readonly AutoResetEvent _commandFinishedEvent = new(false); - private Task _commandWorkerTask; - private CancellationTokenSource _commandCancellationToken; + private Task? _commandWorkerTask; + private CancellationTokenSource? _commandCancellationToken; private volatile int _queueSize = 0; private readonly ManualResetEvent _queueEmptyEvent = new(true); public int QueueSize => _queueSize; - protected QueuedCommand CurrentCommand; - protected IOBDLogger Logger { get; } + protected QueuedCommand? CurrentCommand; + protected IOBDLogger? Logger { get; } protected ISerialConnection Connection { get; } protected char Terminator { get; set; } @@ -40,7 +40,7 @@ public abstract class SerialDevice : IDisposable /// connection. /// terminator used for terminating the command message /// logger instance - protected SerialDevice(ISerialConnection connection, char terminator = '\r', IOBDLogger logger = null) + protected SerialDevice(ISerialConnection connection, char terminator = '\r', IOBDLogger? logger = null) { this.Connection = connection; this.Terminator = terminator; @@ -88,8 +88,7 @@ public abstract class SerialDevice : IDisposable _commandCancellationToken = new CancellationTokenSource(); _commandWorkerTask = Task.Factory.StartNew(CommandWorker); } - - + /// /// Sends the command. /// @@ -105,7 +104,7 @@ public abstract class SerialDevice : IDisposable QueuedCommand cmd = new(command); _queueEmptyEvent.Reset(); - _queueSize++; + Interlocked.Increment(ref _queueSize); _commandQueue.Add(cmd); return cmd.CommandResult; @@ -131,7 +130,7 @@ public abstract class SerialDevice : IDisposable /// /// The sender. /// The instance containing the event data. - private void OnDataReceived(object sender, DataReceivedEventArgs e) + private void OnDataReceived(object? sender, DataReceivedEventArgs e) { for (int i = 0; i < e.Count; i++) { @@ -143,7 +142,7 @@ public abstract class SerialDevice : IDisposable break; case '>': - CurrentCommand.CommandResult.WaitHandle.Set(); + CurrentCommand?.CommandResult.WaitHandle.Set(); _commandFinishedEvent.Set(); break; @@ -178,8 +177,9 @@ public abstract class SerialDevice : IDisposable /// The message. private void InternalProcessMessage(string message) { - object data = ProcessMessage(message); - CurrentCommand.CommandResult.Result = data; + object? data = ProcessMessage(message); + if (CurrentCommand != null) + CurrentCommand.CommandResult.Result = data; } /// @@ -187,13 +187,15 @@ public abstract class SerialDevice : IDisposable /// /// message received /// result data - protected abstract object ProcessMessage(string message); + protected abstract object? ProcessMessage(string message); /// /// Worker method for sending commands /// private async void CommandWorker() { + if (_commandCancellationToken == null) return; + CancellationToken cancellationToken = _commandCancellationToken.Token; while (!_commandCancellationToken.IsCancellationRequested) @@ -207,13 +209,14 @@ public abstract class SerialDevice : IDisposable { if (_commandQueue.TryTake(out CurrentCommand, 10, cancellationToken)) { - _queueSize--; + Interlocked.Decrement(ref _queueSize); Logger?.WriteLine("Writing Command: '" + CurrentCommand.CommandText.Replace('\r', '\'') + "'", OBDLogLevel.Verbose); if (Connection.IsAsync) await Connection.WriteAsync(Encoding.ASCII.GetBytes(CurrentCommand.CommandText)); else + // ReSharper disable once MethodHasAsyncOverload Connection.Write(Encoding.ASCII.GetBytes(CurrentCommand.CommandText)); // wait for command to finish or command canceled @@ -233,7 +236,7 @@ public abstract class SerialDevice : IDisposable public void WaitQueue() => _queueEmptyEvent.WaitOne(); - public async Task WaitQueueAsync() => await Task.Run(() => WaitQueue()); + public async Task WaitQueueAsync() => await Task.Run(WaitQueue); /// /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. @@ -243,7 +246,7 @@ public abstract class SerialDevice : IDisposable _commandQueue.CompleteAdding(); _commandCancellationToken?.Cancel(); _commandWorkerTask?.Wait(); - Connection?.Dispose(); + Connection.Dispose(); } #endregion diff --git a/OBD.NET/OBD.NET/Events/GenericDataEventManager.cs b/OBD.NET/OBD.NET/Events/GenericDataEventManager.cs index a304e8e..1fc0eab 100644 --- a/OBD.NET/OBD.NET/Events/GenericDataEventManager.cs +++ b/OBD.NET/OBD.NET/Events/GenericDataEventManager.cs @@ -9,7 +9,7 @@ public class GenericDataEventManager : IDataEventManager { #region Events - internal event ELM327.DataReceivedEventHandler DataReceived; + internal event ELM327.DataReceivedEventHandler? DataReceived; #endregion diff --git a/OBD.NET/OBD.NET/OBDData/00-1F/CalculatedEngineLoad.cs b/OBD.NET/OBD.NET/OBDData/00-1F/CalculatedEngineLoad.cs index 32da45c..58b9bd0 100644 --- a/OBD.NET/OBD.NET/OBDData/00-1F/CalculatedEngineLoad.cs +++ b/OBD.NET/OBD.NET/OBDData/00-1F/CalculatedEngineLoad.cs @@ -6,7 +6,7 @@ public class CalculatedEngineLoad : AbstractOBDData { #region Properties & Fields - public Percent Load => new(A / 2.55, 0, 100); + public new Percent Load => new(A / 2.55, 0, 100); #endregion diff --git a/OBD.NET/OBD.NET/OBDData/40-5F/AbsoluteLoadValue.cs b/OBD.NET/OBD.NET/OBDData/40-5F/AbsoluteLoadValue.cs index ed08ea1..4cf5edd 100644 --- a/OBD.NET/OBD.NET/OBDData/40-5F/AbsoluteLoadValue.cs +++ b/OBD.NET/OBD.NET/OBDData/40-5F/AbsoluteLoadValue.cs @@ -6,7 +6,7 @@ public class AbsoluteLoadValue : AbstractOBDData { #region Properties & Fields - public Percent Load => new(((256 * A) + B) / 2.55, 0, 25700); + public new Percent Load => new(((256 * A) + B) / 2.55, 0, 25700); #endregion diff --git a/OBD.NET/OBD.NET/OBDData/AbstractOBDData.cs b/OBD.NET/OBD.NET/OBDData/AbstractOBDData.cs index 8985f60..0cd51e8 100644 --- a/OBD.NET/OBD.NET/OBDData/AbstractOBDData.cs +++ b/OBD.NET/OBD.NET/OBDData/AbstractOBDData.cs @@ -9,7 +9,7 @@ public abstract class AbstractOBDData : IOBDData public byte PID { get; } private readonly int _length; - private byte[] _rawData; + private byte[] _rawData = Array.Empty(); public byte[] RawData { get => _rawData; diff --git a/OBD.NET/OBD.NET/Util/AsyncManulResetEvent.cs b/OBD.NET/OBD.NET/Util/AsyncManulResetEvent.cs index 8f442e5..4a93fe5 100644 --- a/OBD.NET/OBD.NET/Util/AsyncManulResetEvent.cs +++ b/OBD.NET/OBD.NET/Util/AsyncManulResetEvent.cs @@ -26,8 +26,8 @@ public class AsyncManualResetEvent public void Set() { TaskCompletionSource tcs = _tcs; - Task.Factory.StartNew(s => ((TaskCompletionSource)s).TrySetResult(true), - tcs, CancellationToken.None, TaskCreationOptions.PreferFairness, TaskScheduler.Default); + Task.Factory.StartNew(s => ((TaskCompletionSource)s!).TrySetResult(true), + tcs, CancellationToken.None, TaskCreationOptions.PreferFairness, TaskScheduler.Default); tcs.Task.Wait(); } @@ -40,8 +40,7 @@ public class AsyncManualResetEvent while (true) { TaskCompletionSource tcs = _tcs; - if (!tcs.Task.IsCompleted || - (Interlocked.CompareExchange(ref _tcs, new TaskCompletionSource(), tcs) == tcs)) + if (!tcs.Task.IsCompleted || (Interlocked.CompareExchange(ref _tcs, new TaskCompletionSource(), tcs) == tcs)) return; } }