From df94010952bf2a34073946ca4ae481b4db4a9d50 Mon Sep 17 00:00:00 2001 From: parallelbgls Date: Thu, 18 May 2017 18:51:01 +0800 Subject: [PATCH] Bug Fix --- Modbus.Net/src/Base.Common/BaseMachine.cs | 4 +-- Modbus.Net/src/Base.Common/BaseProtocal.cs | 21 ++++++------ Modbus.Net/src/Base.Common/TaskManager.cs | 37 +++++++++++++++------- 3 files changed, 40 insertions(+), 22 deletions(-) diff --git a/Modbus.Net/src/Base.Common/BaseMachine.cs b/Modbus.Net/src/Base.Common/BaseMachine.cs index 8331af7..0afc244 100644 --- a/Modbus.Net/src/Base.Common/BaseMachine.cs +++ b/Modbus.Net/src/Base.Common/BaseMachine.cs @@ -413,13 +413,13 @@ namespace Modbus.Net //地址为空报错 if (address == null) { - Console.WriteLine($"Machine {ConnectionToken} Address {value.Key} doesn't exist."); + Log.Error($"Machine {ConnectionToken} Address {value.Key} doesn't exist."); continue; } //不能写报错 if (!address.CanWrite) { - Console.WriteLine($"Machine {ConnectionToken} Address {value.Key} cannot write."); + Log.Error($"Machine {ConnectionToken} Address {value.Key} cannot write."); continue; } addresses.Add(address); diff --git a/Modbus.Net/src/Base.Common/BaseProtocal.cs b/Modbus.Net/src/Base.Common/BaseProtocal.cs index 2d90475..1ab664a 100644 --- a/Modbus.Net/src/Base.Common/BaseProtocal.cs +++ b/Modbus.Net/src/Base.Common/BaseProtocal.cs @@ -80,15 +80,18 @@ namespace Modbus.Net get { var protocalName = type.FullName; - if (Protocals.ContainsKey(protocalName)) - return Protocals[protocalName]; - //自动寻找存在的协议并将其加载 - var protocalUnit = - Activator.CreateInstance(type.GetTypeInfo().Assembly.GetType(protocalName)) as TProtocalUnit; - if (protocalUnit == null) - throw new InvalidCastException($"No ProtocalUnit {nameof(TProtocalUnit)} implemented"); - protocalUnit.Endian = Endian; - Register(protocalUnit); + lock (Protocals) + { + if (Protocals.ContainsKey(protocalName)) + return Protocals[protocalName]; + //自动寻找存在的协议并将其加载 + var protocalUnit = + Activator.CreateInstance(type.GetTypeInfo().Assembly.GetType(protocalName)) as TProtocalUnit; + if (protocalUnit == null) + throw new InvalidCastException($"No ProtocalUnit {nameof(TProtocalUnit)} implemented"); + protocalUnit.Endian = Endian; + Register(protocalUnit); + } return Protocals[protocalName]; } } diff --git a/Modbus.Net/src/Base.Common/TaskManager.cs b/Modbus.Net/src/Base.Common/TaskManager.cs index 22305db..a36638c 100644 --- a/Modbus.Net/src/Base.Common/TaskManager.cs +++ b/Modbus.Net/src/Base.Common/TaskManager.cs @@ -418,10 +418,10 @@ namespace Modbus.Net var cts = new CancellationTokenSource(); cts.CancelAfter(TimeSpan.FromSeconds(100000)); var ans = - await tasks.Run( + await tasks.StartNew( async () => await machine.InvokeMachineMethod>>("GetDatasAsync", - MachineGetDataType.CommunicationTag).WithCancellation(cts.Token)); + MachineGetDataType.CommunicationTag).WithCancellation(cts.Token)).Unwrap(); return new DataReturnDef { MachineId = machine.GetMachineIdString(), @@ -453,10 +453,10 @@ namespace Modbus.Net var cts = new CancellationTokenSource(); cts.CancelAfter(TimeSpan.FromSeconds(100000)); var ans = - await tasks.Run( + await tasks.StartNew( async () => await machine.InvokeMachineMethod>("SetDatasAsync", parameters[0], - MachineSetDataType.CommunicationTag).WithCancellation(cts.Token)); + MachineSetDataType.CommunicationTag).WithCancellation(cts.Token)).Unwrap(); return ans; }; Params = new object[] {values}; @@ -468,7 +468,7 @@ namespace Modbus.Net /// 任务 /// /// 任务返回值的类型 - public class TaskItem : ITaskItem, IEquatable> + public class TaskItem : ITaskItem, IEquatable>, ICloneable { /// /// 定时器 @@ -574,7 +574,7 @@ namespace Modbus.Net /// private void DeactivateTimer() { - Timer.Dispose(); + Timer?.Dispose(); Timer = null; } @@ -595,7 +595,7 @@ namespace Modbus.Net /// private void DeactivateTimerDisconnected() { - TimerDisconnected.Dispose(); + TimerDisconnected?.Dispose(); TimerDisconnected = null; } @@ -620,6 +620,15 @@ namespace Modbus.Net ActivateTimerDisconnected(); return true; } + + /// + /// 拷贝实例 + /// + /// 拷贝的实例 + public object Clone() + { + return MemberwiseClone(); + } } /// @@ -943,7 +952,10 @@ namespace Modbus.Net lock (_machines) { foreach (var machine in _machines) - ans &= machine.InvokeTimer(item); + { + Thread.Sleep(10); + ans &= machine.InvokeTimer(item.Clone() as TaskItem); + } } return ans; } @@ -958,7 +970,10 @@ namespace Modbus.Net lock (_machines) { foreach (var machine in _machines) + { + Thread.Sleep(10); ans &= machine.StopAllTimers(); + } } return ans; } @@ -1052,7 +1067,7 @@ namespace Modbus.Net lock (_machines) { foreach (var machine in _machines) - tasks.Add(machine.InvokeOnce(item)); + tasks.Add(_tasks.StartNew(async () => await machine.InvokeOnce(item.Clone() as TaskItem)).Unwrap()); } var ans = await Task.WhenAll(tasks); return ans.All(p => p); @@ -1069,7 +1084,7 @@ namespace Modbus.Net { var machine = _machines.FirstOrDefault(p => p.Machine.Id.Equals(machineId)); if (machine != null) - return await machine.InvokeOnce(item); + return await machine.InvokeOnce(item.Clone() as TaskItem); return false; } @@ -1084,7 +1099,7 @@ namespace Modbus.Net { var machine = _machines.FirstOrDefault(p => p.Machine.Id.Equals(machineId)); if (machine != null) - return machine.InvokeTimer(item); + return machine.InvokeTimer(item.Clone() as TaskItem); return false; }