From 76719986f6e7b211d1cd2b89bbe00a4d5a9ae9fa Mon Sep 17 00:00:00 2001 From: parallelbgls Date: Mon, 31 Jul 2017 17:24:45 +0800 Subject: [PATCH] 2017-07-31 Update 1 Add Pipeline --- .../Modbus.Net.Core/Modbus.Net.Core.csproj | 3 +- .../Modbus.Net.Modbus.csproj | 2 +- .../Modbus.Net.OPC/Modbus.Net.OPC.csproj | 2 +- Modbus.Net/Modbus.Net.OPC/OpcProtocal.cs | 4 +- Modbus.Net/Modbus.Net.OPC/OpcUtility.cs | 7 +- .../Modbus.Net.Siemens.csproj | 2 +- .../Modbus.Net.Siemens/SiemensPpiProtocal.cs | 27 ++-- .../Modbus.Net.Siemens/SiemensTcpProtocal.cs | 39 +++--- Modbus.Net/Modbus.Net/Modbus.Net.csproj | 3 +- Modbus.Net/src/Base.Common/BaseProtocal.cs | 75 ++++++----- Modbus.Net/src/Base.Common/BaseUtility.cs | 7 +- Modbus.Net/src/Base.Common/IProtocal.cs | 20 +-- Modbus.Net/src/Base.Common/PipeUnit.cs | 116 ++++++++++++++++++ 13 files changed, 219 insertions(+), 88 deletions(-) create mode 100644 Modbus.Net/src/Base.Common/PipeUnit.cs diff --git a/Modbus.Net/Modbus.Net.Core/Modbus.Net.Core.csproj b/Modbus.Net/Modbus.Net.Core/Modbus.Net.Core.csproj index 86df934..8194029 100644 --- a/Modbus.Net/Modbus.Net.Core/Modbus.Net.Core.csproj +++ b/Modbus.Net/Modbus.Net.Core/Modbus.Net.Core.csproj @@ -5,7 +5,7 @@ Modbus.Net.Core Modbus.Net Modbus.Net.Core - 1.3.9 + 1.4.0 Modbus.Net Chris L.(Luo Sheng) Hangzhou Delian IoT Science Technology Co.,Ltd. @@ -52,6 +52,7 @@ + diff --git a/Modbus.Net/Modbus.Net.Modbus/Modbus.Net.Modbus.csproj b/Modbus.Net/Modbus.Net.Modbus/Modbus.Net.Modbus.csproj index 0a9cd54..215e34f 100644 --- a/Modbus.Net/Modbus.Net.Modbus/Modbus.Net.Modbus.csproj +++ b/Modbus.Net/Modbus.Net.Modbus/Modbus.Net.Modbus.csproj @@ -5,7 +5,7 @@ Modbus.Net.Modbus Modbus.Net.Modbus Modbus.Net.Modbus - 1.3.9 + 1.4.0 Chris L.(Luo Sheng) Hangzhou Delian IoT Science Technology Co.,Ltd. Modbus.Net.Modbus diff --git a/Modbus.Net/Modbus.Net.OPC/Modbus.Net.OPC.csproj b/Modbus.Net/Modbus.Net.OPC/Modbus.Net.OPC.csproj index b44303a..8fa1f47 100644 --- a/Modbus.Net/Modbus.Net.OPC/Modbus.Net.OPC.csproj +++ b/Modbus.Net/Modbus.Net.OPC/Modbus.Net.OPC.csproj @@ -5,7 +5,7 @@ Modbus.Net.OPC Modbus.Net.OPC Modbus.Net.OPC - 1.3.9 + 1.4.0 Chris L.(Luo Sheng) Hangzhou Delian IoT Science Technology Co.,Ltd. Modbus.Net OPC Implementation diff --git a/Modbus.Net/Modbus.Net.OPC/OpcProtocal.cs b/Modbus.Net/Modbus.Net.OPC/OpcProtocal.cs index 30c2501..3d9f543 100644 --- a/Modbus.Net/Modbus.Net.OPC/OpcProtocal.cs +++ b/Modbus.Net/Modbus.Net.OPC/OpcProtocal.cs @@ -3,7 +3,9 @@ /// /// Opc协议 /// - public abstract class OpcProtocal : BaseProtocal> + public abstract class OpcProtocal : BaseProtocal, + PipeUnit, + ProtocalUnit>> { /// /// 构造函数 diff --git a/Modbus.Net/Modbus.Net.OPC/OpcUtility.cs b/Modbus.Net/Modbus.Net.OPC/OpcUtility.cs index ea72ded..c469572 100644 --- a/Modbus.Net/Modbus.Net.OPC/OpcUtility.cs +++ b/Modbus.Net/Modbus.Net.OPC/OpcUtility.cs @@ -7,7 +7,9 @@ namespace Modbus.Net.OPC /// /// Opc通用Api入口 /// - public abstract class OpcUtility : BaseUtility> + public abstract class OpcUtility : BaseUtility, + PipeUnit, + ProtocalUnit>> { /// /// 获取分隔符 @@ -80,7 +82,8 @@ namespace Modbus.Net.OPC try { var split = GetSeperator?.Invoke() ?? '/'; - var writeRequestOpcInputStruct = new WriteRequestOpcInputStruct(startAddress.Split('\r'), split, setContents[0]); + var writeRequestOpcInputStruct = + new WriteRequestOpcInputStruct(startAddress.Split('\r'), split, setContents[0]); var writeRequestOpcOutputStruct = await Wrapper.SendReceiveAsync(Wrapper[typeof(WriteRequestOpcProtocal)], diff --git a/Modbus.Net/Modbus.Net.Siemens/Modbus.Net.Siemens.csproj b/Modbus.Net/Modbus.Net.Siemens/Modbus.Net.Siemens.csproj index 13cf6d5..7abcf74 100644 --- a/Modbus.Net/Modbus.Net.Siemens/Modbus.Net.Siemens.csproj +++ b/Modbus.Net/Modbus.Net.Siemens/Modbus.Net.Siemens.csproj @@ -5,7 +5,7 @@ Modbus.Net.Siemens Modbus.Net.Siemens Modbus.Net.Siemens - 1.3.9 + 1.4.0 Chris L.(Luo Sheng) Hangzhou Delian IoT Science Technology Co.,Ltd. Modbus.Net Siemens Profinet Implementation diff --git a/Modbus.Net/Modbus.Net.Siemens/SiemensPpiProtocal.cs b/Modbus.Net/Modbus.Net.Siemens/SiemensPpiProtocal.cs index 269bcd0..fe51273 100644 --- a/Modbus.Net/Modbus.Net.Siemens/SiemensPpiProtocal.cs +++ b/Modbus.Net/Modbus.Net.Siemens/SiemensPpiProtocal.cs @@ -37,7 +37,7 @@ namespace Modbus.Net.Siemens /// /// 写入的内容,使用对象数组描述 /// 从设备获取的字节流 - public override byte[] SendReceive(params object[] content) + public override PipeUnit SendReceive(params object[] content) { return AsyncHelper.RunSync(() => SendReceiveAsync(Endian, content)); } @@ -47,7 +47,7 @@ namespace Modbus.Net.Siemens /// /// 写入的内容,使用对象数组描述 /// 从设备获取的字节流 - public override async Task SendReceiveAsync(params object[] content) + public override async Task SendReceiveAsync(params object[] content) { if (ProtocalLinker == null || !ProtocalLinker.IsConnected) await ConnectAsync(); @@ -60,7 +60,7 @@ namespace Modbus.Net.Siemens /// 协议核心 /// 协议的参数 /// 设备返回的信息 - private async Task ForceSendReceiveAsync(ProtocalUnit unit, IInputStruct content) + private async Task ForceSendReceiveAsync(ProtocalUnit unit, IInputStruct content) { return await base.SendReceiveAsync(unit, content); } @@ -83,21 +83,14 @@ namespace Modbus.Net.Siemens ProtocalLinker = new SiemensPpiProtocalLinker(_com, SlaveAddress); var inputStruct = new ComCreateReferenceSiemensInputStruct(SlaveAddress, MasterAddress); var outputStruct = - await await + (await (await ForceSendReceiveAsync(this[typeof(ComCreateReferenceSiemensProtocal)], - inputStruct). - ContinueWith(async answer => - { - if (!ProtocalLinker.IsConnected) return false; - var inputStruct2 = new ComConfirmMessageSiemensInputStruct(SlaveAddress, MasterAddress); - var outputStruct2 = - (ComConfirmMessageSiemensOutputStruct) - await - ForceSendReceiveAsync(this[typeof(ComConfirmMessageSiemensProtocal)], - inputStruct2); - return outputStruct2 != null; - }); - return outputStruct; + inputStruct)). + SendReceiveAsync(this[typeof(ComConfirmMessageSiemensProtocal)], answer => + + new ComConfirmMessageSiemensInputStruct(SlaveAddress, MasterAddress) + )).Unwrap(); + return outputStruct != null; } } } \ No newline at end of file diff --git a/Modbus.Net/Modbus.Net.Siemens/SiemensTcpProtocal.cs b/Modbus.Net/Modbus.Net.Siemens/SiemensTcpProtocal.cs index c5d8c09..1ced049 100644 --- a/Modbus.Net/Modbus.Net.Siemens/SiemensTcpProtocal.cs +++ b/Modbus.Net/Modbus.Net.Siemens/SiemensTcpProtocal.cs @@ -81,7 +81,7 @@ namespace Modbus.Net.Siemens /// /// 发送的数据 /// 返回的数据 - public override byte[] SendReceive(params object[] content) + public override PipeUnit SendReceive(params object[] content) { return AsyncHelper.RunSync(() => SendReceiveAsync(Endian, content)); } @@ -91,7 +91,7 @@ namespace Modbus.Net.Siemens /// /// 发送的数据 /// 返回的数据 - public override async Task SendReceiveAsync(params object[] content) + public override async Task SendReceiveAsync(params object[] content) { if (ProtocalLinker == null || !ProtocalLinker.IsConnected) await ConnectAsync(); @@ -104,7 +104,7 @@ namespace Modbus.Net.Siemens /// 协议的核心 /// 协议的参数 /// 返回的数据 - public override IOutputStruct SendReceive(ProtocalUnit unit, IInputStruct content) + public override PipeUnit SendReceive(ProtocalUnit unit, IInputStruct content) { return AsyncHelper.RunSync(() => SendReceiveAsync(unit, content)); } @@ -115,15 +115,14 @@ namespace Modbus.Net.Siemens /// 发送的数据 /// 协议的参数 /// 返回的数据 - public override async Task SendReceiveAsync(ProtocalUnit unit, IInputStruct content) + public override async Task SendReceiveAsync(ProtocalUnit unit, IInputStruct content) { if (ProtocalLinker != null && ProtocalLinker.IsConnected) return await base.SendReceiveAsync(unit, content); if (_connectTryCount > 10) return null; return await - await - ConnectAsync() - .ContinueWith(answer => answer.Result ? base.SendReceiveAsync(unit, content) : null); + ConnectAsync() + .ContinueWith(answer => answer.Result ? base.SendReceiveAsync(unit, content) : null).Unwrap(); } /// @@ -132,7 +131,7 @@ namespace Modbus.Net.Siemens /// 发送的数据 /// 协议的参数 /// 返回的数据 - private async Task ForceSendReceiveAsync(ProtocalUnit unit, IInputStruct content) + private async Task ForceSendReceiveAsync(ProtocalUnit unit, IInputStruct content) { return await base.SendReceiveAsync(unit, content); } @@ -157,23 +156,15 @@ namespace Modbus.Net.Siemens if (!await ProtocalLinker.ConnectAsync()) return false; _connectTryCount = 0; var inputStruct = new CreateReferenceSiemensInputStruct(_tdpuSize, _taspSrc, _tsapDst); - return + var outputStruct = //先建立连接,然后建立设备的引用 - await await - ForceSendReceiveAsync(this[typeof(CreateReferenceSiemensProtocal)], inputStruct) - .ContinueWith(async answer => - { - if (!ProtocalLinker.IsConnected) return false; - var inputStruct2 = new EstablishAssociationSiemensInputStruct(0x0101, _maxCalling, - _maxCalled, - _maxPdu); - var outputStruct2 = - (EstablishAssociationSiemensOutputStruct) - await - SendReceiveAsync(this[typeof(EstablishAssociationSiemensProtocal)], - inputStruct2); - return outputStruct2 != null; - }); + (await (await + ForceSendReceiveAsync(this[typeof(CreateReferenceSiemensProtocal)], inputStruct)).SendReceiveAsync( + this[typeof(EstablishAssociationSiemensProtocal)], answer => + new EstablishAssociationSiemensInputStruct(0x0101, _maxCalling, + _maxCalled, + _maxPdu))).Unwrap(); + return outputStruct != null; } } } \ No newline at end of file diff --git a/Modbus.Net/Modbus.Net/Modbus.Net.csproj b/Modbus.Net/Modbus.Net/Modbus.Net.csproj index d0395eb..ecc2153 100644 --- a/Modbus.Net/Modbus.Net/Modbus.Net.csproj +++ b/Modbus.Net/Modbus.Net/Modbus.Net.csproj @@ -5,7 +5,7 @@ Modbus.Net Modbus.Net Modbus.Net - 1.3.9 + 1.4.0 Modbus.Net Chris L.(Luo Sheng) Hangzhou Delian IoT Science Technology Co.,Ltd. @@ -52,6 +52,7 @@ + diff --git a/Modbus.Net/src/Base.Common/BaseProtocal.cs b/Modbus.Net/src/Base.Common/BaseProtocal.cs index 0f7acfb..1d58f15 100644 --- a/Modbus.Net/src/Base.Common/BaseProtocal.cs +++ b/Modbus.Net/src/Base.Common/BaseProtocal.cs @@ -9,7 +9,7 @@ namespace Modbus.Net /// /// 基本协议 /// - public abstract class BaseProtocal : BaseProtocal + public abstract class BaseProtocal : BaseProtocal { /// /// 构造器 @@ -24,12 +24,32 @@ namespace Modbus.Net /// /// 写入的内容,使用对象数组描述 /// 从设备获取的字节流 - public override async Task SendReceiveAsync(params object[] content) + public override async Task SendReceiveAsync(params object[] content) { - if (ProtocalLinker == null || !ProtocalLinker.IsConnected) - await ConnectAsync(); - if (ProtocalLinker != null) - return await ProtocalLinker.SendReceiveAsync(ProtocalUnit.TranslateContent(Endian, content)); + if (content != null) + { + var pipeUnit = + new PipeUnit( + ProtocalLinker); + return await pipeUnit.SendReceiveAsync(Endian, paramOut => content); + } + return null; + } + + /// + /// 发送协议,通过传入需要使用的协议内容和输入结构 + /// + /// 协议的实例 + /// 输入信息的结构化描述 + /// 输出信息的结构化描述 + public override async Task + SendReceiveAsync(ProtocalUnit unit, IInputStruct content) + { + if (content != null) + { + var pipeUnit = new PipeUnit(ProtocalLinker); + return await pipeUnit.SendReceiveAsync(unit, paramOut => content); + } return null; } } @@ -37,9 +57,11 @@ namespace Modbus.Net /// /// 基本协议 /// - public abstract class BaseProtocal : - IProtocal where TProtocalUnit : class, IProtocalFormatting + public abstract class BaseProtocal : + IProtocal + where TProtocalUnit : class, IProtocalFormatting where TParamOut : class + where TPipeUnit : PipeUnit, TProtocalUnit> { /// /// 构造器 @@ -93,7 +115,8 @@ namespace Modbus.Net { //自动寻找存在的协议并将其加载 var protocalUnit = - Activator.CreateInstance(type.GetTypeInfo().Assembly.GetType(protocalName)) as TProtocalUnit; + Activator.CreateInstance(type.GetTypeInfo().Assembly + .GetType(protocalName)) as TProtocalUnit; if (protocalUnit == null) throw new InvalidCastException($"No ProtocalUnit {nameof(TProtocalUnit)} implemented"); protocalUnit.Endian = Endian; @@ -138,7 +161,8 @@ namespace Modbus.Net /// 协议的实例 /// 输入信息的结构化描述 /// 输出信息的结构化描述 - public virtual IOutputStruct SendReceive(TProtocalUnit unit, IInputStruct content) + public virtual TPipeUnit SendReceive( + TProtocalUnit unit, IInputStruct content) { return AsyncHelper.RunSync(() => SendReceiveAsync(unit, content)); } @@ -149,9 +173,17 @@ namespace Modbus.Net /// 协议的实例 /// 输入信息的结构化描述 /// 输出信息的结构化描述 - public virtual async Task SendReceiveAsync(TProtocalUnit unit, IInputStruct content) + public virtual async Task + SendReceiveAsync(TProtocalUnit unit, IInputStruct content) { - return await SendReceiveAsync(unit, content); + if (content != null) + { + var pipeUnit = + new PipeUnit, TProtocalUnit>( + ProtocalLinker); + return await pipeUnit.SendReceiveAsync(unit, paramOut => content) as TPipeUnit; + } + return null; } /// @@ -159,7 +191,7 @@ namespace Modbus.Net /// /// 写入的内容,使用对象数组描述 /// 从设备获取的字节流 - public virtual TParamOut SendReceive(params object[] content) + public virtual TPipeUnit SendReceive(params object[] content) { return AsyncHelper.RunSync(() => SendReceiveAsync(content)); } @@ -169,7 +201,7 @@ namespace Modbus.Net /// /// 写入的内容,使用对象数组描述 /// 从设备获取的字节流 - public virtual Task SendReceiveAsync(params object[] content) + public virtual Task SendReceiveAsync(params object[] content) { throw new NotImplementedException(); } @@ -196,20 +228,7 @@ namespace Modbus.Net public virtual async Task SendReceiveAsync(TProtocalUnit unit, IInputStruct content) where T : class, IOutputStruct { - var t = 0; - var formatContent = unit.Format(content); - if (formatContent != null) - { - TParamOut receiveContent; - //如果为特别处理协议的话,跳过协议扩展收缩 - if (unit.GetType().GetTypeInfo().GetCustomAttributes(typeof(SpecialProtocalUnitAttribute)).Any()) - receiveContent = await ProtocalLinker.SendReceiveWithoutExtAndDecAsync(formatContent); - else - receiveContent = await ProtocalLinker.SendReceiveAsync(formatContent); - if (receiveContent != null) - return unit.Unformat(receiveContent, ref t); - } - return null; + return (await SendReceiveAsync(unit, content)).Unwrap(); } /// diff --git a/Modbus.Net/src/Base.Common/BaseUtility.cs b/Modbus.Net/src/Base.Common/BaseUtility.cs index f6a7797..5908772 100644 --- a/Modbus.Net/src/Base.Common/BaseUtility.cs +++ b/Modbus.Net/src/Base.Common/BaseUtility.cs @@ -30,7 +30,7 @@ namespace Modbus.Net /// /// 基础Api入口 /// - public abstract class BaseUtility : BaseUtility + public abstract class BaseUtility : BaseUtility { /// /// 构造器 @@ -43,13 +43,14 @@ namespace Modbus.Net /// /// 基础Api入口 /// - public abstract class BaseUtility : IUtilityProperty, IUtilityMethodData + public abstract class BaseUtility : IUtilityProperty, IUtilityMethodData where TProtocalUnit : class, IProtocalFormatting where TParamOut : class + where TPipeUnit : PipeUnit, TProtocalUnit> { /// /// 协议收发主体 /// - protected IProtocal Wrapper; + protected IProtocal Wrapper; /// /// 构造器 diff --git a/Modbus.Net/src/Base.Common/IProtocal.cs b/Modbus.Net/src/Base.Common/IProtocal.cs index 0739ee7..37dedb8 100644 --- a/Modbus.Net/src/Base.Common/IProtocal.cs +++ b/Modbus.Net/src/Base.Common/IProtocal.cs @@ -9,8 +9,10 @@ namespace Modbus.Net /// 向Connector传入的类型 /// 从Connector返回的类型 /// 协议单元的类型 - public interface IProtocal - where TProtocalUnit : IProtocalFormatting + public interface IProtocal + where TProtocalUnit : class, IProtocalFormatting + where TParamOut : class + where TPipeUnit : PipeUnit, TProtocalUnit> { /// /// 协议的连接器 @@ -47,14 +49,14 @@ namespace Modbus.Net /// /// 写入的内容,使用对象数组描述 /// 从设备获取的字节流 - TParamOut SendReceive(params object[] content); + TPipeUnit SendReceive(params object[] content); /// /// 发送协议内容并接收,一般方法 /// /// 写入的内容,使用对象数组描述 /// 从设备获取的字节流 - Task SendReceiveAsync(params object[] content); + Task SendReceiveAsync(params object[] content); /// /// 发送协议,通过传入需要使用的协议内容和输入结构 @@ -62,7 +64,7 @@ namespace Modbus.Net /// 协议的实例 /// 输入信息的结构化描述 /// 输出信息的结构化描述 - IOutputStruct SendReceive(TProtocalUnit unit, IInputStruct content); + TPipeUnit SendReceive(TProtocalUnit unit, IInputStruct content); /// /// 发送协议,通过传入需要使用的协议内容和输入结构 @@ -70,7 +72,7 @@ namespace Modbus.Net /// 协议的实例 /// 输入信息的结构化描述 /// 输出信息的结构化描述 - Task SendReceiveAsync(TProtocalUnit unit, IInputStruct content); + Task SendReceiveAsync(TProtocalUnit unit, IInputStruct content); /// /// 发送协议,通过传入需要使用的协议内容和输入结构 @@ -79,7 +81,8 @@ namespace Modbus.Net /// 输入信息的结构化描述 /// 输出信息的结构化描述 /// IOutputStruct的具体类型 - T SendReceive(TProtocalUnit unit, IInputStruct content) where T : class, IOutputStruct; + T SendReceive( + TProtocalUnit unit, IInputStruct content) where T : class, IOutputStruct; /// /// 发送协议,通过传入需要使用的协议内容和输入结构 @@ -88,6 +91,7 @@ namespace Modbus.Net /// 输入信息的结构化描述 /// 输出信息的结构化描述 /// IOutputStruct的具体类型 - Task SendReceiveAsync(TProtocalUnit unit, IInputStruct content) where T : class, IOutputStruct; + Task SendReceiveAsync( + TProtocalUnit unit, IInputStruct content) where T : class, IOutputStruct; } } \ No newline at end of file diff --git a/Modbus.Net/src/Base.Common/PipeUnit.cs b/Modbus.Net/src/Base.Common/PipeUnit.cs new file mode 100644 index 0000000..9a92b3d --- /dev/null +++ b/Modbus.Net/src/Base.Common/PipeUnit.cs @@ -0,0 +1,116 @@ +using System; +using System.Linq; +using System.Reflection; +using System.Threading.Tasks; + +namespace Modbus.Net +{ + public class PipeUnit : PipeUnit, ProtocalUnit> + { + public PipeUnit(IProtocalLinker protocalLinker) : base(protocalLinker) + { + + } + + protected PipeUnit(IProtocalLinker protocalLinker, ProtocalUnit protocalUnit, byte[] parameters, + bool success) : base(protocalLinker, protocalUnit, parameters, success) + { + } + + public async Task SendReceiveAsync(Endian endian, Func inputStructCreator) + { + if (Success) + { + var content = inputStructCreator.Invoke(ReturnParams); + if (ProtocalLinker != null) + return new PipeUnit(ProtocalLinker, null, + await ProtocalLinker.SendReceiveAsync(ProtocalUnit.TranslateContent(endian, content)), + true); + } + return new PipeUnit(ProtocalLinker, null, ReturnParams, false); + } + + public async Task SendReceiveAsync( + ProtocalUnit unit, + Func inputStructCreator) + { + var receiveContent = await SendReceiveAsync1(unit, inputStructCreator); + if (receiveContent != null) + return new PipeUnit(ProtocalLinker, unit, + receiveContent, true); + return new PipeUnit(ProtocalLinker, unit, ReturnParams, + false); + } + + public byte[] Unwrap() + { + return ReturnParams; + } + } + + public class PipeUnit + where TProtocalUnit : class, IProtocalFormatting + where TProtocalLinker : class, IProtocalLinker + where TParamOut : class + { + public PipeUnit(TProtocalLinker protocalLinker) : this(protocalLinker, null, null, true) + { + + } + + protected PipeUnit(TProtocalLinker protocalLinker, TProtocalUnit protocalUnit, TParamOut parameters, bool success) + { + ProtocalLinker = protocalLinker; + ProtocalUnit = protocalUnit; + ReturnParams = parameters; + Success = success; + } + + protected TProtocalLinker ProtocalLinker { get; set; } + + protected TProtocalUnit ProtocalUnit { get; set; } + + protected TParamOut ReturnParams { get; set; } + + public bool Success { get; } + + protected async Task SendReceiveAsync1(TProtocalUnit unit, + Func inputStructCreator) + { + if (Success) + { + var content = inputStructCreator.Invoke(ReturnParams); + var formatContent = unit.Format(content); + if (formatContent != null) + { + TParamOut receiveContent; + //如果为特别处理协议的话,跳过协议扩展收缩 + if (unit.GetType().GetTypeInfo().GetCustomAttributes(typeof(SpecialProtocalUnitAttribute)).Any()) + receiveContent = await ProtocalLinker.SendReceiveWithoutExtAndDecAsync(formatContent); + else + receiveContent = await ProtocalLinker.SendReceiveAsync(formatContent); + return receiveContent; + } + } + return null; + } + + public virtual async Task> SendReceiveAsync( + TProtocalUnit unit, + Func inputStructCreator) + { + var receiveContent = await SendReceiveAsync1(unit, inputStructCreator); + if (receiveContent != null) + return new PipeUnit(ProtocalLinker, unit, + receiveContent, true); + return new PipeUnit(ProtocalLinker, unit, ReturnParams, + false); + } + + public T Unwrap() where T : class, IOutputStruct + { + var t = 0; + return ProtocalUnit.Unformat(ReturnParams, ref t); + } + } +} \ No newline at end of file