From 7f9dd5858099dd2dbbeb555309c2b71f5c1e2371 Mon Sep 17 00:00:00 2001 From: "parallelbgls@outlook.com" Date: Tue, 4 Aug 2015 09:47:46 +0800 Subject: [PATCH] 2015-08-04 update 1 --- Modbus.Net/ModBus.Net/BaseMachine.cs | 9 ++ Modbus.Net/ModBus.Net/ProtocalLinker.cs | 7 +- Modbus.Net/ModBus.Net/TaskManager.cs | 114 +++++++++++++++++++----- 3 files changed, 107 insertions(+), 23 deletions(-) diff --git a/Modbus.Net/ModBus.Net/BaseMachine.cs b/Modbus.Net/ModBus.Net/BaseMachine.cs index dc56831..b321a8b 100644 --- a/Modbus.Net/ModBus.Net/BaseMachine.cs +++ b/Modbus.Net/ModBus.Net/BaseMachine.cs @@ -12,6 +12,14 @@ namespace ModBus.Net public string MachineName { get; set; } + public bool IsConnected + { + get + { + return BaseUtility.IsConnected; + } + } + public string ConnectionToken { get { return BaseUtility.ConnectionToken; } @@ -52,6 +60,7 @@ namespace ModBus.Net { BaseUtility.Connect(); } + if (!BaseUtility.IsConnected) return null; foreach (var communicateAddress in CommunicateAddresses) { var datas = BaseUtility.GetDatas(2, 0, AddressFormater.FormatAddress(communicateAddress.Area,communicateAddress.Address), communicateAddress.GetCount); diff --git a/Modbus.Net/ModBus.Net/ProtocalLinker.cs b/Modbus.Net/ModBus.Net/ProtocalLinker.cs index 9413085..2eb0d0a 100644 --- a/Modbus.Net/ModBus.Net/ProtocalLinker.cs +++ b/Modbus.Net/ModBus.Net/ProtocalLinker.cs @@ -16,7 +16,12 @@ namespace ModBus.Net public bool IsConnected { - get { return _baseConnector.IsConnected; } + get + { + if (_baseConnector == null) + return false; + return _baseConnector.IsConnected; + } } public bool Connect() diff --git a/Modbus.Net/ModBus.Net/TaskManager.cs b/Modbus.Net/ModBus.Net/TaskManager.cs index 092e0a7..537dd6e 100644 --- a/Modbus.Net/ModBus.Net/TaskManager.cs +++ b/Modbus.Net/ModBus.Net/TaskManager.cs @@ -94,7 +94,7 @@ namespace ModBus.Net // Get the next item from the queue item = _tasks.First.Value; - _tasks.RemoveFirst(); + _tasks.RemoveFirst(); } // Execute the task we pulled out of the queue @@ -166,11 +166,13 @@ namespace ModBus.Net public class TaskManager { private HashSet _machines; + private HashSet _unlinkedMachines; private TaskFactory> _tasks; private TaskScheduler _scheduler; private CancellationTokenSource _cts; private Timer _timer; + private Timer _timer2; private bool _keepConnect; @@ -212,8 +214,11 @@ namespace ModBus.Net if (_timer != null) { _timer.Change(Timeout.Infinite, Timeout.Infinite); + _timer2.Change(Timeout.Infinite, Timeout.Infinite); _timer.Dispose(); + _timer2.Dispose(); _timer = null; + _timer2 = null; } } else if (value < 0) return; @@ -222,14 +227,18 @@ namespace ModBus.Net if (_timer != null) { _timer.Change(Timeout.Infinite, Timeout.Infinite); + _timer2.Change(Timeout.Infinite, Timeout.Infinite); _timer.Dispose(); + _timer2.Dispose(); _timer = null; + _timer2 = null; } if (value > 0) { _getCycle = value; } _timer = new Timer(MaintainTasks, null, 0, _getCycle * 1000); + _timer2 = new Timer(MaintainTasks2, null, _getCycle * 6000, _getCycle * 6000); //MaintainTasks(null); } } @@ -248,7 +257,8 @@ namespace ModBus.Net public TaskManager(int maxRunningTask, int getCycle, bool keepConnect) { _scheduler = new LimitedConcurrencyLevelTaskScheduler(maxRunningTask); - _machines = new HashSet(new BaseMachineEqualityComparer()); + _machines = new HashSet(new BaseMachineEqualityComparer()); + _unlinkedMachines = new HashSet(new BaseMachineEqualityComparer()); _getCycle = getCycle; KeepConnect = keepConnect; } @@ -289,6 +299,42 @@ namespace ModBus.Net } } + public void MoveMachineToUnlinked(int id) + { + IEnumerable machines; + lock(_machines) + { + machines = _machines.Where(c => c.Id == id).ToList(); + if (machines.Count() <= 0) return; + _machines.RemoveWhere(p => p.Id == id); + } + lock(_unlinkedMachines) + { + foreach(var machine in machines) + { + _unlinkedMachines.Add(machine); + } + } + } + + public void MoveMachineToLinked(int id) + { + IEnumerable machines; + lock (_unlinkedMachines) + { + machines = _unlinkedMachines.Where(c => c.Id == id).ToList(); + if (machines.Count() <= 0) return; + _unlinkedMachines.RemoveWhere(p => p.Id == id); + } + lock (_machines) + { + foreach (var machine in machines) + { + _machines.Add(machine); + } + } + } + public void RemoveMachine(BaseMachine machine) { lock (_machines) @@ -297,26 +343,37 @@ namespace ModBus.Net } } - private void MaintainTasks(object sender) { - try - { - AsyncHelper.RunSync(MaintainTasksAsync); - } - catch (Exception) - { - TaskStop(); - TaskStart(); - } + AsyncHelper.RunSync(MaintainTasksAsync); + } + + private void MaintainTasks2(object sender) + { + AsyncHelper.RunSync(MaintainTasks2Async); } private async Task MaintainTasksAsync() { HashSet saveMachines = new HashSet(); + IEnumerable saveMachinesEnum = new List(); lock (_machines) { saveMachines.UnionWith(_machines); + saveMachinesEnum = saveMachines.ToList(); + } + foreach (var machine in saveMachinesEnum) + { + await RunTask(machine); + } + } + + private async Task MaintainTasks2Async() + { + HashSet saveMachines = new HashSet(); + lock (_unlinkedMachines) + { + saveMachines.UnionWith(_unlinkedMachines); } foreach (var machine in saveMachines) { @@ -334,20 +391,21 @@ namespace ModBus.Net public void TaskStop() { - GetCycle = Timeout.Infinite; - if (_cts != null) + lock (_machines) { - _cts.Cancel(); - } - if (_machines != null) - { - lock (_machines) + GetCycle = Timeout.Infinite; + if (_cts != null) + { + _cts.Cancel(); + } + if (_machines != null) { foreach (var machine in _machines) { machine.Disconnect(); } } + _tasks = null; } } @@ -357,16 +415,28 @@ namespace ModBus.Net { //var ans = machine.GetDatas(); CancellationTokenSource cts = new CancellationTokenSource(); - cts.CancelAfter(TimeSpan.FromSeconds(_getCycle * 2)); + cts.CancelAfter(TimeSpan.FromSeconds(_getCycle)); var ans = await _tasks.StartNew(machine.GetDatas, cts.Token); + //var ans = await Task.Factory.StartNew(machine.GetDatas, cts.Token); + if (!machine.IsConnected) + { + MoveMachineToUnlinked(machine.Id); + } + else + { + MoveMachineToLinked(machine.Id); + } if (ReturnValues != null) { ReturnValues(new KeyValuePair>(machine.Id, ans)); } } - catch (Exception) + catch (Exception e) { - + if (!machine.IsConnected) + { + MoveMachineToUnlinked(machine.Id); + } if (ReturnValues != null) { ReturnValues(new KeyValuePair>(machine.Id, null));