2017-12-27 Update 3 Add semaphore in FifoController

This commit is contained in:
parallelbgls
2017-12-27 18:22:04 +08:00
parent 786cf51162
commit 61284758e6

View File

@@ -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;
}
} }
} }