This commit is contained in:
luosheng
2023-07-18 22:08:38 +08:00
parent b6325f46ad
commit af40306be8
4 changed files with 74 additions and 17 deletions

View File

@@ -83,6 +83,11 @@ namespace Modbus.Net
/// </summary> /// </summary>
private Task _receiveThread; private Task _receiveThread;
/// <summary>
/// 终止获取线程
/// </summary>
private CancellationTokenSource _receiveThreadCancel;
/// <summary> /// <summary>
/// 缓冲的字节流 /// 缓冲的字节流
/// </summary> /// </summary>
@@ -272,6 +277,8 @@ namespace Modbus.Net
// Release managed resources // Release managed resources
} }
// Release unmanaged resources // Release unmanaged resources
Controller?.SendStop();
ReceiveMsgThreadStop();
Linkers?.Remove((_slave, _com)); Linkers?.Remove((_slave, _com));
logger.LogInformation("Com connector {ConnectionToken} Removed", _com); logger.LogInformation("Com connector {ConnectionToken} Removed", _com);
if (Linkers?.Count(p => p.Item2 == _com) == 0) if (Linkers?.Count(p => p.Item2 == _com) == 0)
@@ -282,13 +289,11 @@ namespace Modbus.Net
} }
SerialPort?.Dispose(); SerialPort?.Dispose();
logger.LogInformation("Com interface {Com} Disposed", _com); logger.LogInformation("Com interface {Com} Disposed", _com);
Controller?.SendStop();
if (Connectors.ContainsKey(_com)) if (Connectors.ContainsKey(_com))
{ {
Connectors[_com] = null; Connectors[_com] = null;
Connectors.Remove(_com); Connectors.Remove(_com);
} }
ReceiveMsgThreadStop();
} }
} }
@@ -479,7 +484,7 @@ namespace Modbus.Net
message.Length); message.Length);
logger.LogDebug( logger.LogDebug(
$"Com client {ConnectionToken} send msg: {String.Concat(message.Select(p => " " + p.ToString("X2")))}"); $"Com client {ConnectionToken} send msg: {String.Concat(message.Select(p => " " + p.ToString("X2")))}");
await Task.Run(() => SerialPort.Write(message, 0, message.Length)); await Task.Run(() => SerialPort?.Write(message, 0, message.Length));
} }
catch (Exception err) catch (Exception err)
{ {
@@ -490,19 +495,39 @@ namespace Modbus.Net
} }
/// <inheritdoc /> /// <inheritdoc />
protected override void ReceiveMsgThreadStart() protected override async void ReceiveMsgThreadStart()
{ {
if (_receiveThread == null) if (_receiveThread == null)
{ {
_receiveThread = Task.Run(ReceiveMessage); _receiveThreadCancel = new CancellationTokenSource();
_receiveThread = Task.Run(async ()=>await ReceiveMessage(_receiveThreadCancel.Token), _receiveThreadCancel.Token);
try
{
await _receiveThread;
}
catch (OperationCanceledException)
{ }
finally
{
_receiveThreadCancel.Dispose();
_receiveThreadCancel = null;
}
} }
} }
/// <inheritdoc /> /// <inheritdoc />
protected override void ReceiveMsgThreadStop() protected override void ReceiveMsgThreadStop()
{ {
_receiveThread?.Dispose(); _receiveThreadCancel?.Cancel();
if (_receiveThread != null)
{
while (!_receiveThread.IsCanceled)
{
Thread.Sleep(10);
}
_receiveThread.Dispose();
_receiveThread = null; _receiveThread = null;
}
CacheClear(); CacheClear();
Controller?.Clear(); Controller?.Clear();
} }
@@ -518,7 +543,7 @@ namespace Modbus.Net
} }
} }
private async Task ReceiveMessage() private async Task ReceiveMessage(CancellationToken token)
{ {
while (true) while (true)
{ {
@@ -582,6 +607,10 @@ namespace Modbus.Net
CacheClear(); CacheClear();
logger.LogError(e, "Com client {ConnectionToken} read msg error", ConnectionToken); logger.LogError(e, "Com client {ConnectionToken} read msg error", ConnectionToken);
} }
if (token.IsCancellationRequested)
{
token.ThrowIfCancellationRequested();
}
} }
} }

View File

@@ -1,3 +1,4 @@
using Quartz.Logging;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
@@ -26,6 +27,8 @@ namespace Modbus.Net
/// </summary> /// </summary>
public virtual bool IsSending => SendingThread != null; public virtual bool IsSending => SendingThread != null;
private CancellationTokenSource _sendingThreadCancel;
/// <summary> /// <summary>
/// 包切分位置函数 /// 包切分位置函数
/// </summary> /// </summary>
@@ -68,23 +71,43 @@ namespace Modbus.Net
/// <summary> /// <summary>
/// 发送消息的实际内部方法 /// 发送消息的实际内部方法
/// </summary> /// </summary>
protected abstract void SendingMessageControlInner(); protected abstract void SendingMessageControlInner(CancellationToken token);
/// <inheritdoc /> /// <inheritdoc />
public virtual void SendStop() public virtual void SendStop()
{ {
Clear(); Clear();
SendingThread?.Dispose(); _sendingThreadCancel?.Cancel();
if (SendingThread != null)
{
while (!SendingThread.IsCanceled)
{
Thread.Sleep(10);
}
SendingThread.Dispose();
SendingThread = null; SendingThread = null;
}
Clear(); Clear();
} }
/// <inheritdoc /> /// <inheritdoc />
public virtual void SendStart() public virtual async void SendStart()
{ {
if (!IsSending) if (!IsSending)
{ {
SendingThread = Task.Run(() => SendingMessageControlInner()); _sendingThreadCancel = new CancellationTokenSource();
SendingThread = Task.Run(() => SendingMessageControlInner(_sendingThreadCancel.Token), _sendingThreadCancel.Token);
try
{
await SendingThread;
}
catch (OperationCanceledException)
{ }
finally
{
_sendingThreadCancel.Dispose();
_sendingThreadCancel = null;
}
} }
} }

View File

@@ -36,7 +36,7 @@ namespace Modbus.Net
} }
/// <inheritdoc /> /// <inheritdoc />
protected override void SendingMessageControlInner() protected override void SendingMessageControlInner(CancellationToken token)
{ {
while (true) while (true)
{ {
@@ -80,6 +80,10 @@ namespace Modbus.Net
SendStop(); SendStop();
} }
} }
if (token.IsCancellationRequested)
{
token.ThrowIfCancellationRequested();
}
} }
} }

View File

@@ -1,5 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Threading;
namespace Modbus.Net namespace Modbus.Net
{ {
@@ -32,7 +33,7 @@ namespace Modbus.Net
} }
/// <inheritdoc /> /// <inheritdoc />
protected override void SendingMessageControlInner() protected override void SendingMessageControlInner(CancellationToken token)
{ {
//empty //empty
} }