2017-12-27 Update 3 Add semaphore in FifoController
This commit is contained in:
@@ -17,6 +17,10 @@ namespace Modbus.Net
|
|||||||
|
|
||||||
private bool _taskCancel = false;
|
private bool _taskCancel = false;
|
||||||
|
|
||||||
|
private int _waitingListMaxCount = 10000;
|
||||||
|
|
||||||
|
private Semaphore _taskCycleSema;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 间隔时间
|
/// 间隔时间
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -28,6 +32,7 @@ namespace Modbus.Net
|
|||||||
/// <param name="acquireTime">间隔时间</param>
|
/// <param name="acquireTime">间隔时间</param>
|
||||||
public FifoController(int acquireTime)
|
public FifoController(int acquireTime)
|
||||||
{
|
{
|
||||||
|
_taskCycleSema = new Semaphore(0, _waitingListMaxCount);
|
||||||
AcquireTime = acquireTime;
|
AcquireTime = acquireTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -36,12 +41,14 @@ namespace Modbus.Net
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
_taskCycleSema.WaitOne();
|
||||||
while (!_taskCancel)
|
while (!_taskCancel)
|
||||||
{
|
{
|
||||||
if (AcquireTime > 0)
|
if (AcquireTime > 0)
|
||||||
{
|
{
|
||||||
Thread.Sleep(AcquireTime);
|
Thread.Sleep(AcquireTime);
|
||||||
}
|
}
|
||||||
|
bool sendSuccess = false;
|
||||||
lock (WaitingMessages)
|
lock (WaitingMessages)
|
||||||
{
|
{
|
||||||
if (_currentSendingPos == null)
|
if (_currentSendingPos == null)
|
||||||
@@ -50,21 +57,29 @@ namespace Modbus.Net
|
|||||||
{
|
{
|
||||||
_currentSendingPos = WaitingMessages.First();
|
_currentSendingPos = WaitingMessages.First();
|
||||||
_currentSendingPos.SendMutex.Set();
|
_currentSendingPos.SendMutex.Set();
|
||||||
|
sendSuccess = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (_currentSendingPos != null)
|
else
|
||||||
{
|
{
|
||||||
if (WaitingMessages.Count <= 0)
|
if (WaitingMessages.Count <= 0)
|
||||||
{
|
{
|
||||||
_currentSendingPos = null;
|
_currentSendingPos = null;
|
||||||
|
_taskCycleSema.Close();
|
||||||
|
sendSuccess = true;
|
||||||
}
|
}
|
||||||
if (WaitingMessages.Count > WaitingMessages.IndexOf(_currentSendingPos) + 1)
|
else if (WaitingMessages.Count > WaitingMessages.IndexOf(_currentSendingPos) + 1)
|
||||||
{
|
{
|
||||||
_currentSendingPos = WaitingMessages[WaitingMessages.IndexOf(_currentSendingPos) + 1];
|
_currentSendingPos = WaitingMessages[WaitingMessages.IndexOf(_currentSendingPos) + 1];
|
||||||
_currentSendingPos.SendMutex.Set();
|
_currentSendingPos.SendMutex.Set();
|
||||||
|
sendSuccess = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (sendSuccess)
|
||||||
|
{
|
||||||
|
_taskCycleSema.WaitOne();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (ObjectDisposedException)
|
catch (ObjectDisposedException)
|
||||||
@@ -102,5 +117,20 @@ namespace Modbus.Net
|
|||||||
{
|
{
|
||||||
return WaitingMessages.FirstOrDefault();
|
return WaitingMessages.FirstOrDefault();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
protected override bool AddMessageToList(MessageWaitingDef def)
|
||||||
|
{
|
||||||
|
if (WaitingMessages.Count > _waitingListMaxCount)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
var success = base.AddMessageToList(def);
|
||||||
|
if (success)
|
||||||
|
{
|
||||||
|
_taskCycleSema.Release();
|
||||||
|
}
|
||||||
|
return success;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user