diff --git a/Modbus.Net/Modbus.Net.CodeGenerator/ConnectorWithControllerByteArrayCodeGenerator.cs b/Modbus.Net/Modbus.Net.CodeGenerator/ConnectorWithControllerByteArrayCodeGenerator.cs index 1eb9c69..74dcb4f 100644 --- a/Modbus.Net/Modbus.Net.CodeGenerator/ConnectorWithControllerByteArrayCodeGenerator.cs +++ b/Modbus.Net/Modbus.Net.CodeGenerator/ConnectorWithControllerByteArrayCodeGenerator.cs @@ -112,7 +112,7 @@ namespace Modbus.Net IDisposable asyncLock = null; try { - if (Controller.IsSending != true) + if (!Controller.IsSending) { Controller.SendStart(); } diff --git a/Modbus.Net/Modbus.Net/Connector/ComConnector.cs b/Modbus.Net/Modbus.Net/Connector/ComConnector.cs index a2a84af..8694a69 100644 --- a/Modbus.Net/Modbus.Net/Connector/ComConnector.cs +++ b/Modbus.Net/Modbus.Net/Connector/ComConnector.cs @@ -82,10 +82,6 @@ namespace Modbus.Net /// 获取线程 /// private Task _receiveThread; - /// - /// 获取线程关闭 - /// - private bool _taskCancel = false; /// /// 缓冲的字节流 @@ -276,23 +272,23 @@ namespace Modbus.Net // Release managed resources } // Release unmanaged resources - if (SerialPort != null) + Linkers?.Remove((_slave, _com)); + logger.LogInformation("Com connector {ConnectionToken} Removed", _com); + if (Linkers?.Count(p => p.Item2 == _com) == 0) { - Linkers.Remove((_slave, _com)); - logger.LogInformation("Com connector {ConnectionToken} Removed", _com); - if (Linkers.Count(p => p.Item2 == _com) == 0) + if (SerialPort?.IsOpen == true) + { + SerialPort?.Close(); + } + SerialPort?.Dispose(); + logger.LogInformation("Com interface {Com} Disposed", _com); + Controller?.SendStop(); + if (Connectors.ContainsKey(_com)) { - if (SerialPort.IsOpen) - { - SerialPort.Close(); - } - SerialPort.Dispose(); - logger.LogInformation("Com interface {Com} Disposed", _com); - Controller.SendStop(); Connectors[_com] = null; Connectors.Remove(_com); - ReceiveMsgThreadStop(); } + ReceiveMsgThreadStop(); } } @@ -365,7 +361,7 @@ namespace Modbus.Net { lock (SerialPort) { - _taskCancel = false; + ReceiveMsgThreadStop(); SerialPort.Open(); ReceiveMsgThreadStart(); Controller.SendStart(); @@ -496,18 +492,35 @@ namespace Modbus.Net /// protected override void ReceiveMsgThreadStart() { - _receiveThread = Task.Run(ReceiveMessage); + if (_receiveThread == null) + { + _receiveThread = Task.Run(ReceiveMessage); + } } /// protected override void ReceiveMsgThreadStop() { - _taskCancel = true; + _receiveThread?.Dispose(); + _receiveThread = null; + CacheClear(); + Controller?.Clear(); + } + + private void CacheClear() + { + if (CacheBytes != null) + { + lock (CacheBytes) + { + CacheBytes.Clear(); + } + } } private async Task ReceiveMessage() { - while (!_taskCancel) + while (true) { try { @@ -532,10 +545,7 @@ namespace Modbus.Net CacheBytes.Count); logger.LogError( $"Com client {ConnectionToken} cached msg: {string.Concat(CacheBytes.Select(p => " " + p.ToString("X2")))}"); - lock (CacheBytes) - { - CacheBytes.Clear(); - } + CacheClear(); } else { @@ -569,6 +579,7 @@ namespace Modbus.Net } catch (Exception e) { + CacheClear(); logger.LogError(e, "Com client {ConnectionToken} read msg error", ConnectionToken); } } diff --git a/Modbus.Net/Modbus.Net/Controller/BaseController.cs b/Modbus.Net/Modbus.Net/Controller/BaseController.cs index b921b62..0f6869b 100644 --- a/Modbus.Net/Modbus.Net/Controller/BaseController.cs +++ b/Modbus.Net/Modbus.Net/Controller/BaseController.cs @@ -24,7 +24,7 @@ namespace Modbus.Net /// /// Ϣά߳Ƿ /// - public virtual bool? IsSending => SendingThread?.Status == TaskStatus.Running || SendingThread?.Status == TaskStatus.WaitingToRun || SendingThread?.Status == TaskStatus.Created; + public virtual bool IsSending => SendingThread != null; /// /// зλú @@ -73,7 +73,8 @@ namespace Modbus.Net /// public virtual void SendStop() { - SendingThread.Dispose(); + Clear(); + SendingThread?.Dispose(); SendingThread = null; Clear(); } @@ -81,7 +82,7 @@ namespace Modbus.Net /// public virtual void SendStart() { - if (IsSending != true) + if (!IsSending) { SendingThread = Task.Run(() => SendingMessageControlInner()); } @@ -90,9 +91,12 @@ namespace Modbus.Net /// public void Clear() { - lock (WaitingMessages) + if (WaitingMessages != null) { - WaitingMessages.Clear(); + lock (WaitingMessages) + { + WaitingMessages.Clear(); + } } } @@ -196,13 +200,7 @@ namespace Modbus.Net if (def != null) { def.ReceiveMessage = message.Item1; - lock (WaitingMessages) - { - if (WaitingMessages.IndexOf(def) >= 0) - { - WaitingMessages.Remove(def); - } - } + ForceRemoveWaitingMessage(def); def.ReceiveMutex.Set(); ans.Add((message.Item1, true)); } diff --git a/Modbus.Net/Modbus.Net/Controller/FifoController.cs b/Modbus.Net/Modbus.Net/Controller/FifoController.cs index a14b478..592d3eb 100644 --- a/Modbus.Net/Modbus.Net/Controller/FifoController.cs +++ b/Modbus.Net/Modbus.Net/Controller/FifoController.cs @@ -14,8 +14,6 @@ namespace Modbus.Net private MessageWaitingDef _currentSendingPos; - private bool _taskCancel = false; - private int _waitingListMaxCount; /// @@ -40,7 +38,7 @@ namespace Modbus.Net /// protected override void SendingMessageControlInner() { - while (!_taskCancel) + while (true) { if (AcquireTime > 0) { @@ -79,25 +77,10 @@ namespace Modbus.Net catch (Exception e) { logger.LogError(e, "Controller throws exception"); - _taskCancel = true; + SendStop(); } } } - SendStop(); - } - - /// - public override void SendStart() - { - _taskCancel = false; - base.SendStart(); - } - - /// - public override void SendStop() - { - _taskCancel = true; - base.SendStop(); } /// @@ -124,7 +107,7 @@ namespace Modbus.Net { return false; } - if (_taskCancel) + if (!IsSending) { return false; } diff --git a/Modbus.Net/Modbus.Net/Controller/MatchDirectlySendController.cs b/Modbus.Net/Modbus.Net/Controller/MatchDirectlySendController.cs index 7401a7c..b6e1627 100644 --- a/Modbus.Net/Modbus.Net/Controller/MatchDirectlySendController.cs +++ b/Modbus.Net/Modbus.Net/Controller/MatchDirectlySendController.cs @@ -11,7 +11,7 @@ namespace Modbus.Net /// /// 消息维护线程是否在运行 /// - public override bool? IsSending => true; + public override bool IsSending => true; /// public MatchDirectlySendController(ICollection<(int, int)>[] keyMatches, diff --git a/Modbus.Net/Modbus.Net/Interface/IController.cs b/Modbus.Net/Modbus.Net/Interface/IController.cs index c3fd62e..2cb9431 100644 --- a/Modbus.Net/Modbus.Net/Interface/IController.cs +++ b/Modbus.Net/Modbus.Net/Interface/IController.cs @@ -10,7 +10,7 @@ namespace Modbus.Net /// /// Ϣά߳Ƿ /// - bool? IsSending { get; } + bool IsSending { get; } /// /// Ϣ