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; }
///
/// Ϣ