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