From 4da73f205567bc84874203c2abc4ec86021ee357 Mon Sep 17 00:00:00 2001 From: parallelbgls Date: Wed, 14 Sep 2016 11:10:25 +0800 Subject: [PATCH] maxRunningTask reopen --- Modbus.Net/Modbus.Net/TaskManager.cs | 76 +++++++++++++++++----------- 1 file changed, 46 insertions(+), 30 deletions(-) diff --git a/Modbus.Net/Modbus.Net/TaskManager.cs b/Modbus.Net/Modbus.Net/TaskManager.cs index a31f167..d2e8c8c 100644 --- a/Modbus.Net/Modbus.Net/TaskManager.cs +++ b/Modbus.Net/Modbus.Net/TaskManager.cs @@ -23,7 +23,7 @@ namespace Modbus.Net public static int Restore = 0; } - /*public class LimitedConcurrencyLevelTaskScheduler : TaskScheduler + public class LimitedConcurrencyLevelTaskScheduler : TaskScheduler { /// /// Whether the current thread is processing work items. @@ -172,7 +172,7 @@ namespace Modbus.Net if (lockTaken) Monitor.Exit(_tasks); } } - }*/ + } public class TaskManager { @@ -184,9 +184,10 @@ namespace Modbus.Net /// 不在运行的设备 /// private HashSet _unlinkedMachines; - //private TaskFactory> _tasks; - //private TaskScheduler _scheduler; - //private CancellationTokenSource _cts; + + private TaskFactory _tasks; + private TaskScheduler _scheduler; + private CancellationTokenSource _cts; /// /// 正常读取的计时器 @@ -309,7 +310,7 @@ namespace Modbus.Net public MachineGetDataType GetDataType { get; set; } public MachineSetDataType SetDataType { get; set; } - /*public int MaxRunningTasks + public int MaxRunningTasks { get { return _scheduler.MaximumConcurrencyLevel; } set @@ -317,7 +318,7 @@ namespace Modbus.Net TaskStop(); _scheduler = new LimitedConcurrencyLevelTaskScheduler(value); } - }*/ + } /// /// 构造一个TaskManager @@ -326,9 +327,9 @@ namespace Modbus.Net /// 读取数据的时间间隔(秒) /// 读取数据后是否保持连接 /// 获取与设置数据的方式 - public TaskManager(/*int maxRunningTask,*/ int getCycle, bool keepConnect, MachineDataType dataType = MachineDataType.CommunicationTag) + public TaskManager(int maxRunningTask, int getCycle, bool keepConnect, MachineDataType dataType = MachineDataType.CommunicationTag) { - //_scheduler = new LimitedConcurrencyLevelTaskScheduler(maxRunningTask); + _scheduler = new LimitedConcurrencyLevelTaskScheduler(maxRunningTask); _machines = new HashSet(new BaseMachineEqualityComparer()); _unlinkedMachines = new HashSet(new BaseMachineEqualityComparer()); _getCycle = getCycle; @@ -480,16 +481,28 @@ namespace Modbus.Net /// private async Task MaintainTasksAsync() { - HashSet saveMachines = new HashSet(); - IEnumerable saveMachinesEnum; - lock (_machines) + try { - saveMachines.UnionWith(_machines); - saveMachinesEnum = saveMachines.ToList(); + var tasks = new List(); + HashSet saveMachines = new HashSet(); + IEnumerable saveMachinesEnum; + lock (_machines) + { + saveMachines.UnionWith(_machines); + saveMachinesEnum = saveMachines.ToList(); + } + foreach (var machine in saveMachinesEnum) + { + CancellationTokenSource cts = new CancellationTokenSource(); + cts.CancelAfter(TimeSpan.FromSeconds(_getCycle * 10)); + var task = _tasks.StartNew(() => RunTask(machine).WithCancellation(cts.Token)); + tasks.Add(task); + } + await Task.WhenAll(tasks); } - foreach (var machine in saveMachinesEnum) + catch { - await RunTask(machine); + return; } } @@ -499,23 +512,26 @@ namespace Modbus.Net /// private async Task MaintainTasks2Async() { + var tasks = new List(); HashSet saveMachines = new HashSet(); lock (_unlinkedMachines) { saveMachines.UnionWith(_unlinkedMachines); } - foreach (var machine in saveMachines) + try { - try + foreach (var machine in saveMachines) { CancellationTokenSource cts = new CancellationTokenSource(); cts.CancelAfter(TimeSpan.FromSeconds(_getCycle * 10)); - await RunTask(machine).WithCancellation(cts.Token); - } - catch - { - return; + var task = _tasks.StartNew(() => RunTask(machine).WithCancellation(cts.Token)); + tasks.Add(task); } + await Task.WhenAll(); + } + catch + { + return; } } @@ -543,8 +559,8 @@ namespace Modbus.Net public void TaskStart() { TaskStop(); - //_cts = new CancellationTokenSource(); - //_tasks = new TaskFactory>(_cts.Token, TaskCreationOptions.None, TaskContinuationOptions.None, _scheduler); + _cts = new CancellationTokenSource(); + _tasks = new TaskFactory(_cts.Token, TaskCreationOptions.None, TaskContinuationOptions.None, _scheduler); GetCycle = TimeRestore.Restore; } @@ -556,10 +572,10 @@ namespace Modbus.Net lock (_machines) { GetCycle = Timeout.Infinite; - //if (_cts != null) - //{ - // _cts.Cancel(); - //} + if (_cts != null) + { + _cts.Cancel(); + } if (_machines != null) { foreach (var machine in _machines) @@ -567,7 +583,7 @@ namespace Modbus.Net machine.Disconnect(); } } - //_tasks = null; + _tasks = null; } }