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>
private Task _receiveThread;
/// <summary>
/// 终止获取线程
/// </summary>
private CancellationTokenSource _receiveThreadCancel;
/// <summary>
/// 缓冲的字节流
/// </summary>
@@ -272,6 +277,8 @@ namespace Modbus.Net
// Release managed resources
}
// Release unmanaged resources
Controller?.SendStop();
ReceiveMsgThreadStop();
Linkers?.Remove((_slave, _com));
logger.LogInformation("Com connector {ConnectionToken} Removed", _com);
if (Linkers?.Count(p => p.Item2 == _com) == 0)
@@ -282,13 +289,11 @@ namespace Modbus.Net
}
SerialPort?.Dispose();
logger.LogInformation("Com interface {Com} Disposed", _com);
Controller?.SendStop();
if (Connectors.ContainsKey(_com))
{
Connectors[_com] = null;
Connectors.Remove(_com);
}
ReceiveMsgThreadStop();
}
}
@@ -479,7 +484,7 @@ namespace Modbus.Net
message.Length);
logger.LogDebug(
$"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)
{
@@ -490,19 +495,39 @@ namespace Modbus.Net
}
/// <inheritdoc />
protected override void ReceiveMsgThreadStart()
protected override async void ReceiveMsgThreadStart()
{
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 />
protected override void ReceiveMsgThreadStop()
{
_receiveThread?.Dispose();
_receiveThreadCancel?.Cancel();
if (_receiveThread != null)
{
while (!_receiveThread.IsCanceled)
{
Thread.Sleep(10);
}
_receiveThread.Dispose();
_receiveThread = null;
}
CacheClear();
Controller?.Clear();
}
@@ -518,7 +543,7 @@ namespace Modbus.Net
}
}
private async Task ReceiveMessage()
private async Task ReceiveMessage(CancellationToken token)
{
while (true)
{
@@ -582,6 +607,10 @@ namespace Modbus.Net
CacheClear();
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.Collections.Generic;
using System.Linq;
@@ -26,6 +27,8 @@ namespace Modbus.Net
/// </summary>
public virtual bool IsSending => SendingThread != null;
private CancellationTokenSource _sendingThreadCancel;
/// <summary>
/// 包切分位置函数
/// </summary>
@@ -68,23 +71,43 @@ namespace Modbus.Net
/// <summary>
/// 发送消息的实际内部方法
/// </summary>
protected abstract void SendingMessageControlInner();
protected abstract void SendingMessageControlInner(CancellationToken token);
/// <inheritdoc />
public virtual void SendStop()
{
Clear();
SendingThread?.Dispose();
_sendingThreadCancel?.Cancel();
if (SendingThread != null)
{
while (!SendingThread.IsCanceled)
{
Thread.Sleep(10);
}
SendingThread.Dispose();
SendingThread = null;
}
Clear();
}
/// <inheritdoc />
public virtual void SendStart()
public virtual async void SendStart()
{
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 />
protected override void SendingMessageControlInner()
protected override void SendingMessageControlInner(CancellationToken token)
{
while (true)
{
@@ -80,6 +80,10 @@ namespace Modbus.Net
SendStop();
}
}
if (token.IsCancellationRequested)
{
token.ThrowIfCancellationRequested();
}
}
}

View File

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