diff --git a/Modbus.Net/Modbus.Net/FifoController.cs b/Modbus.Net/Modbus.Net/FifoController.cs
index 6cbf4a6..8a9de06 100644
--- a/Modbus.Net/Modbus.Net/FifoController.cs
+++ b/Modbus.Net/Modbus.Net/FifoController.cs
@@ -17,6 +17,10 @@ namespace Modbus.Net
private bool _taskCancel = false;
+ private int _waitingListMaxCount = 10000;
+
+ private Semaphore _taskCycleSema;
+
///
/// 间隔时间
///
@@ -28,6 +32,7 @@ namespace Modbus.Net
/// 间隔时间
public FifoController(int acquireTime)
{
+ _taskCycleSema = new Semaphore(0, _waitingListMaxCount);
AcquireTime = acquireTime;
}
@@ -36,12 +41,14 @@ namespace Modbus.Net
{
try
{
+ _taskCycleSema.WaitOne();
while (!_taskCancel)
{
if (AcquireTime > 0)
{
Thread.Sleep(AcquireTime);
}
+ bool sendSuccess = false;
lock (WaitingMessages)
{
if (_currentSendingPos == null)
@@ -50,21 +57,29 @@ namespace Modbus.Net
{
_currentSendingPos = WaitingMessages.First();
_currentSendingPos.SendMutex.Set();
+ sendSuccess = true;
}
}
- if (_currentSendingPos != null)
+ else
{
if (WaitingMessages.Count <= 0)
{
_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.SendMutex.Set();
+ sendSuccess = true;
}
}
}
+ if (sendSuccess)
+ {
+ _taskCycleSema.WaitOne();
+ }
}
}
catch (ObjectDisposedException)
@@ -102,5 +117,20 @@ namespace Modbus.Net
{
return WaitingMessages.FirstOrDefault();
}
+
+ ///
+ protected override bool AddMessageToList(MessageWaitingDef def)
+ {
+ if (WaitingMessages.Count > _waitingListMaxCount)
+ {
+ return false;
+ }
+ var success = base.AddMessageToList(def);
+ if (success)
+ {
+ _taskCycleSema.Release();
+ }
+ return success;
+ }
}
}