Fix
This commit is contained in:
@@ -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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user