lith 4 年之前
父節點
當前提交
3719d0d18e

+ 1 - 1
dotnet/Library/Sers/Sers.Core/Sers.Core/CL/CommunicationManage/CommunicationManageClient.cs

@@ -17,7 +17,7 @@ namespace Sers.Core.CL.CommunicationManage
         {
             defaultConfig= ConfigurationManager.Instance.GetByPath<JObject>("Sers.CL.Config")??new JObject();
 
-            requestTimeoutMs = defaultConfig["requestTimeoutMs"]?.ConvertBySerialize<int?>() ?? 6000;
+            requestTimeoutMs = defaultConfig["requestTimeoutMs"]?.ConvertBySerialize<int?>() ?? 60000;
         }
 
         private JObject defaultConfig;

+ 1 - 2
dotnet/Library/Sers/Sers.Core/Sers.Core/CL/MessageOrganize/DefaultOrganize/OrganizeClient.cs

@@ -1,5 +1,4 @@
 using System;
-using System.Collections.Generic;
 using Newtonsoft.Json.Linq;
 using Sers.Core.CL.MessageDelivery;
 using Vit.Core.Module.Log;
@@ -148,7 +147,7 @@ namespace Sers.Core.CL.MessageOrganize.DefaultOrganize
             bool success = false;
             try
             {
-                if (conn.SendRequest(requestData, out var replyData) && replyData.ByteDataToString() == "true")
+                if (conn.SendRequest(requestData, out var replyData, requestAdaptor.requestTimeoutMs) && replyData.ByteDataToString() == "true")
                 {
                     success = true;
                     Logger.Info("[CL.OrganizeClient] Authentication - succeed.");

+ 4 - 5
dotnet/Library/Sers/Sers.Core/Sers.Core/CL/MessageOrganize/DefaultOrganize/OrganizeConnection.cs

@@ -1,5 +1,5 @@
 using System;
-using System.Collections.Generic;
+using System.Runtime.CompilerServices;
 using Sers.Core.CL.MessageDelivery;
 
 namespace Sers.Core.CL.MessageOrganize.DefaultOrganize
@@ -18,20 +18,19 @@ namespace Sers.Core.CL.MessageOrganize.DefaultOrganize
         }
 
 
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
         public void SendMessageAsync(Vit.Core.Util.Pipelines.ByteData message)
         {
             requestAdaptor.SendMessageAsync(this, message);
         }
 
 
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
         public void SendRequestAsync(Object sender, Vit.Core.Util.Pipelines.ByteData requestData, Action<object, Vit.Core.Util.Pipelines.ByteData> callback)
         {
             requestAdaptor.SendRequestAsync(this, sender, requestData, callback);
         }
-        public bool SendRequest(Vit.Core.Util.Pipelines.ByteData requestData, out Vit.Core.Util.Pipelines.ByteData replyData)
-        {
-            return requestAdaptor.SendRequest(this, requestData, out replyData);
-        }
+       
 
         public void Close() 
         {

+ 11 - 9
dotnet/Library/Sers/Sers.Core/Sers.Core/CL/MessageOrganize/DefaultOrganize/OrganizeServer.cs

@@ -1,6 +1,6 @@
 using System;
 using System.Collections.Concurrent;
-using System.Collections.Generic;
+using System.Runtime.CompilerServices;
 using System.Threading.Tasks;
 using Newtonsoft.Json.Linq;
 using Sers.Core.CL.MessageDelivery;
@@ -147,16 +147,18 @@ namespace Sers.Core.CL.MessageOrganize.DefaultOrganize
         }
 
 
-        public void Station_SendMessageAsync(IOrganizeConnection conn, Vit.Core.Util.Pipelines.ByteData message)
-        {
-            requestAdaptor.SendMessageAsync(conn, message);
-        }
+        //[MethodImpl(MethodImplOptions.AggressiveInlining)]
+        //public void Station_SendMessageAsync(IOrganizeConnection conn, Vit.Core.Util.Pipelines.ByteData message)
+        //{
+        //    requestAdaptor.SendMessageAsync(conn, message);
+        //}
 
 
-        public void Station_SendRequestAsync(IOrganizeConnection conn, Object sender, Vit.Core.Util.Pipelines.ByteData requestData, Action<object, Vit.Core.Util.Pipelines.ByteData> callback)
-        {
-            requestAdaptor.SendRequestAsync(conn, sender, requestData, callback);
-        }
+        //[MethodImpl(MethodImplOptions.AggressiveInlining)]
+        //public void Station_SendRequestAsync(IOrganizeConnection conn, Object sender, Vit.Core.Util.Pipelines.ByteData requestData, Action<object, Vit.Core.Util.Pipelines.ByteData> callback)
+        //{
+        //    requestAdaptor.SendRequestAsync(conn, sender, requestData, callback);
+        //}
 
 
 

+ 25 - 94
dotnet/Library/Sers/Sers.Core/Sers.Core/CL/MessageOrganize/DefaultOrganize/RequestAdaptor.cs

@@ -1,6 +1,7 @@
 using System;
 using System.Collections.Concurrent;
 using System.Collections.Generic;
+using System.Runtime.CompilerServices;
 using System.Threading;
 using Newtonsoft.Json.Linq;
 using Sers.Core.CL.MessageDelivery;
@@ -60,6 +61,7 @@ namespace Sers.Core.CL.MessageOrganize.DefaultOrganize
         #region (x.x.2)SendMessage SendRequest
 
 
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
         public void SendMessageAsync(IOrganizeConnection conn, Vit.Core.Util.Pipelines.ByteData message)
         {
             Delivery_SendFrameAsync(conn, (byte)EFrameType.message, 0, message);
@@ -67,6 +69,7 @@ namespace Sers.Core.CL.MessageOrganize.DefaultOrganize
 
 
 
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
         public long SendRequestAsync(IOrganizeConnection conn, Object sender, Vit.Core.Util.Pipelines.ByteData requestData, Action<object, Vit.Core.Util.Pipelines.ByteData> callback, ERequestType requestType = ERequestType.app)
         {
             //no need guid,just make sure reqKey is unique in current connection client
@@ -84,55 +87,7 @@ namespace Sers.Core.CL.MessageOrganize.DefaultOrganize
             //SendRequest
             Delivery_SendFrameAsync(conn, (byte)EFrameType.request, (byte)requestType, reqRepFrame);
             return reqKey;
-        }
-
-        #region static curAutoResetEvent      
-        public static AutoResetEvent curAutoResetEvent   => 
-            _curAutoResetEvent.Value ?? (_curAutoResetEvent.Value = new AutoResetEvent(false));  
-
-        static System.Threading.ThreadLocal<AutoResetEvent> _curAutoResetEvent = new System.Threading.ThreadLocal<AutoResetEvent>();
-        #endregion
-
-
-        public bool SendRequest(IOrganizeConnection conn, Vit.Core.Util.Pipelines.ByteData requestData, out ByteData replyData)
-        {
-            ByteData _replyData = null;
-
-            AutoResetEvent mEvent = curAutoResetEvent;    
-            mEvent.Reset();
-
-            long reqKey = SendRequestAsync(conn, null, requestData, (sender, replyData_) => {
-                _replyData = replyData_;
-                mEvent?.Set();
-            });
-
-            bool success;
-            try
-            {
-                success = mEvent.WaitOne(requestTimeoutMs);
-            }
-            finally
-            {
-                mEvent = null;
-            }
-
-
-            if (success)
-            {        
-                replyData = _replyData;
-                return true;
-            }
-            else
-            {
-                if (OrganizeToDelivery_RequestMap_TryRemove(reqKey, out var requestInfo))
-                {
-                   
-                }
-                replyData = null;
-                return false;
-            }
-
-        }
+        }       
 
         #endregion
 
@@ -253,9 +208,10 @@ namespace Sers.Core.CL.MessageOrganize.DefaultOrganize
         //IConsumer<DeliveryToOrganize_MessageFrame> task_DeliveryToOrganize_Processor = new Consumer_WorkerPoolCascade<DeliveryToOrganize_MessageFrame>();
 
 
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
         void DeliveryToOrganize_OnGetMessageFrame(IOrganizeConnection conn, ArraySegment<byte> messageFrame)
         {
-            var msg = DeliveryToOrganize_MessageFrame.Pop();
+            var msg = new DeliveryToOrganize_MessageFrame();
             msg.conn = conn;
             msg.messageFrame = messageFrame;
 
@@ -267,25 +223,7 @@ namespace Sers.Core.CL.MessageOrganize.DefaultOrganize
         class DeliveryToOrganize_MessageFrame
         {
             public IOrganizeConnection conn { get; set; }
-            public ArraySegment<byte>? messageFrame;
-
-
-            public static DeliveryToOrganize_MessageFrame Pop()
-            {
-                return ObjectPool<DeliveryToOrganize_MessageFrame>.Shared.Pop();
-            }
-
-            /// <summary>
-            /// 使用结束请手动调用
-            /// </summary>
-            public void Push()
-            {
-                conn = null;
-                messageFrame = null;
-
-                ObjectPool<DeliveryToOrganize_MessageFrame>.Shared.Push(this);
-            }
-
+            public ArraySegment<byte>? messageFrame;           
         }
 
 
@@ -293,38 +231,23 @@ namespace Sers.Core.CL.MessageOrganize.DefaultOrganize
         {
             public IOrganizeConnection conn { get; set; }
 
-            public long reqKey; 
-            public static DeliveryToOrganize_RequestInfo Pop()
-            {
-                return ObjectPool<DeliveryToOrganize_RequestInfo>.Shared.Pop();
-            }
-
-            /// <summary>
-            /// 使用结束请手动调用
-            /// </summary>
-            public void Push()
-            {
-                conn = null;
-                ObjectPool<DeliveryToOrganize_RequestInfo>.Shared.Push(this);
-            }
+            public long reqKey;            
         }
         #endregion
 
         #endregion
-        
+
 
 
         #region DeliveryToOrganize_ProcessFrame
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
         void DeliveryToOrganize_ProcessFrame(DeliveryToOrganize_MessageFrame msgFrame)
         {
-            IOrganizeConnection conn = msgFrame.conn;
-            var messageFrame = msgFrame.messageFrame;
-
-            msgFrame.Push();
+            IOrganizeConnection conn = msgFrame.conn;  
 
-            if (messageFrame == null) return;
+            if (msgFrame.messageFrame == null) return;
 
-            var data = messageFrame.Value;
+            var data = msgFrame.messageFrame.Value;
 
             if (data.Count <= 2) return;
 
@@ -347,7 +270,7 @@ namespace Sers.Core.CL.MessageOrganize.DefaultOrganize
                     {
                         byte requestType = data.Array[data.Offset + 1];
 
-                        var reqInfo = DeliveryToOrganize_RequestInfo.Pop();
+                        var reqInfo = new DeliveryToOrganize_RequestInfo();
                         reqInfo.conn = conn;
                         UnpackReqRepFrame(msgData, out reqInfo.reqKey, out var requestData);
 
@@ -370,7 +293,8 @@ namespace Sers.Core.CL.MessageOrganize.DefaultOrganize
         #region DeliveryToOrganize_OnGetRequest
 
         const string organizeVersion = "Sers.Mq.Socket.v1";
-        
+
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
         void DeliveryToOrganize_OnGetRequest(DeliveryToOrganize_RequestInfo reqInfo, byte requestType, ArraySegment<byte> requestData)
         {
             switch ((ERequestType)requestType)
@@ -400,14 +324,15 @@ namespace Sers.Core.CL.MessageOrganize.DefaultOrganize
         }
         #endregion
 
-               
+
         #region DeliveryToOrganize_SendReply
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
         private void DeliveryToOrganize_SendReply(object sender, Vit.Core.Util.Pipelines.ByteData replyData)
         {
             DeliveryToOrganize_RequestInfo reqInfo = sender as DeliveryToOrganize_RequestInfo;
             var conn = reqInfo.conn;
             var reqKey = reqInfo.reqKey;
-            reqInfo.Push();
+      
 
             PackageReqRepFrame(reqKey, replyData, out var repFrame);
 
@@ -435,12 +360,14 @@ namespace Sers.Core.CL.MessageOrganize.DefaultOrganize
         readonly ConcurrentDictionary<long, OrganizeToDelivery_RequestInfo> organizeToDelivery_RequestMap0 = new ConcurrentDictionary<long, OrganizeToDelivery_RequestInfo>();
         readonly ConcurrentDictionary<long, OrganizeToDelivery_RequestInfo> organizeToDelivery_RequestMap1 = new ConcurrentDictionary<long, OrganizeToDelivery_RequestInfo>();
 
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
         bool OrganizeToDelivery_RequestMap_TryRemove(long guid, out OrganizeToDelivery_RequestInfo reqInfo)
         {
             return (guid > 0 ? organizeToDelivery_RequestMap0 : organizeToDelivery_RequestMap1).TryRemove(guid, out reqInfo);
         }
 
 
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
         void OrganizeToDelivery_RequestMap_Set(ref long guid, OrganizeToDelivery_RequestInfo reqInfo)
         {
             if (organizeToDelivery_RequestMap_timeoutTime < DateTime.Now)
@@ -491,6 +418,7 @@ namespace Sers.Core.CL.MessageOrganize.DefaultOrganize
 
 
         #region (x.5)Delivery_SendFrameAsync        
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
         void Delivery_SendFrameAsync(IOrganizeConnection conn, byte msgType, byte requestType, Vit.Core.Util.Pipelines.ByteData data)
         {
             //var item = DataPool.BytesGet(2);
@@ -509,6 +437,7 @@ namespace Sers.Core.CL.MessageOrganize.DefaultOrganize
 
         readonly SersTimer heartBeat_Timer = new SersTimer();
 
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
         void HeartBeat_Loop()
         {
             try
@@ -663,6 +592,7 @@ namespace Sers.Core.CL.MessageOrganize.DefaultOrganize
                     第1部分: 请求标识(reqKey)(long)			长度为8字节
                     第2部分: 消息内容(oriMsg)
         */
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
         internal static void UnpackReqRepFrame(ArraySegment<byte> reqRepFrame, out long reqKey, out ArraySegment<byte> oriMsg)
         {
             //第1帧            
@@ -678,6 +608,7 @@ namespace Sers.Core.CL.MessageOrganize.DefaultOrganize
         /// <param name="reqKey"></param>
         /// <param name="oriMsg"></param>
         /// <param name="reqRepFrame"></param>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
         static void PackageReqRepFrame(long reqKey, Vit.Core.Util.Pipelines.ByteData oriMsg, out Vit.Core.Util.Pipelines.ByteData reqRepFrame)
         {
             //*

+ 55 - 0
dotnet/Library/Sers/Sers.Core/Sers.Core/CL/MessageOrganize/Extensions/IOrganizeConnectionExtensions.cs

@@ -0,0 +1,55 @@
+using System.Runtime.CompilerServices;
+using Sers.Core.CL.MessageOrganize;
+using System.Threading;
+using Vit.Core.Util.Pipelines;
+
+namespace Vit.Extensions
+{
+    public static partial class IOrganizeConnectionExtensions
+    {
+
+        public static AutoResetEvent curAutoResetEvent =>
+           _curAutoResetEvent.Value ?? (_curAutoResetEvent.Value = new AutoResetEvent(false));
+
+        static System.Threading.ThreadLocal<AutoResetEvent> _curAutoResetEvent = new System.Threading.ThreadLocal<AutoResetEvent>();
+
+
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static bool SendRequest(this IOrganizeConnection conn, Vit.Core.Util.Pipelines.ByteData requestData, out ByteData replyData, int requestTimeoutMs = 60000)
+        {
+            ByteData _replyData = null;
+
+            AutoResetEvent mEvent = curAutoResetEvent;
+            mEvent.Reset();
+
+            conn.SendRequestAsync(null, requestData, (sender, replyData_) => {
+                _replyData = replyData_;
+                mEvent?.Set();
+            });
+
+            bool success;
+            try
+            {
+                success = mEvent.WaitOne(requestTimeoutMs);
+            }
+            finally
+            {
+                mEvent = null;
+            }
+
+
+            if (success)
+            {
+                replyData = _replyData;
+                return true;
+            }
+            else
+            {                
+                replyData = null;
+                return false;
+            }
+        }      
+    
+ 
+    }
+}

+ 1 - 3
dotnet/Library/Sers/Sers.Core/Sers.Core/CL/MessageOrganize/IOrganizeConnection.cs

@@ -1,5 +1,4 @@
 using System;
-using System.Collections.Generic;
 
 namespace Sers.Core.CL.MessageOrganize
 {
@@ -10,8 +9,7 @@ namespace Sers.Core.CL.MessageOrganize
         void SendMessageAsync(Vit.Core.Util.Pipelines.ByteData message);
 
 
-        void SendRequestAsync(Object sender, Vit.Core.Util.Pipelines.ByteData requestData, Action<object, Vit.Core.Util.Pipelines.ByteData> callback);
-        bool SendRequest(Vit.Core.Util.Pipelines.ByteData requestData, out Vit.Core.Util.Pipelines.ByteData replyData);
+        void SendRequestAsync(Object sender, Vit.Core.Util.Pipelines.ByteData requestData, Action<object, Vit.Core.Util.Pipelines.ByteData> callback); 
 
 
         void Close();

+ 0 - 1
dotnet/Library/Sers/Sers.Core/Sers.Core/CL/MessageOrganize/IOrganizeServer.cs

@@ -1,5 +1,4 @@
 using System;
-using System.Collections.Generic;
 
 namespace Sers.Core.CL.MessageOrganize
 {

+ 84 - 40
dotnet/Library/Sers/Sers.Core/Sers.Core/Module/Api/ApiClient.cs

@@ -21,16 +21,17 @@ namespace Sers.Core.Module.Api
         /// callbacks长度必须大于1
         /// </summary>
         /// <param name="callbacks"></param>
-        public static void SetOnSendRequest(Func<Vit.Core.Util.Pipelines.ByteData, ArraySegment<byte>>[] callbacks)
+        public static void SetOnSendRequest(Action<Vit.Core.Util.Pipelines.ByteData, Action<ArraySegment<byte>>>[] callbacks,int requestTimeoutMs)
         {
             Instances = new ApiClient[callbacks.Length];
 
             Instances[0] = Instance;
             Instance.OnSendRequest = callbacks[0];
+            Instance.requestTimeoutMs = requestTimeoutMs;
 
             for (int i = 1; i < callbacks.Length; i++)
             {
-                Instances[i] = new ApiClient { OnSendRequest = callbacks[i] };
+                Instances[i] = new ApiClient { OnSendRequest = callbacks[i], requestTimeoutMs= requestTimeoutMs };
             }
         }
 
@@ -39,69 +40,87 @@ namespace Sers.Core.Module.Api
 
 
 
-        #region CallApi
+        #region 成员变量
+
+        int requestTimeoutMs;
+
+        private Action<Vit.Core.Util.Pipelines.ByteData, Action<ArraySegment<byte>>> OnSendRequest { get; set; }
+        #endregion
+
 
-        private Func<Vit.Core.Util.Pipelines.ByteData, ArraySegment<byte>> OnSendRequest { get; set; }
 
 
         #region CallApi 原始
 
-        /// <summary>
-        /// 
-        /// </summary>
-        /// <param name="reqOri"></param>
-        /// <returns></returns>
         [MethodImpl(MethodImplOptions.AggressiveInlining)]
-        private ArraySegment<byte> CallApi(Vit.Core.Util.Pipelines.ByteData reqOri)
+        public void CallApiAsync(Vit.Core.Util.Pipelines.ByteData apiRequestData, Action<ArraySegment<byte>> callback)
         {
-            return OnSendRequest(reqOri);
+            OnSendRequest(apiRequestData, callback);
         }
 
-        /// <summary>
-        /// 
-        /// </summary>
-        /// <param name="request"></param>
-        /// <returns></returns>
+        #endregion
+
+
+
+        #region CallApi 
+
+        #region static curAutoResetEvent      
+        public static AutoResetEvent curAutoResetEvent =>
+            _curAutoResetEvent.Value ?? (_curAutoResetEvent.Value = new AutoResetEvent(false));
+
+        static System.Threading.ThreadLocal<AutoResetEvent> _curAutoResetEvent = new System.Threading.ThreadLocal<AutoResetEvent>();
+        #endregion
+
+
+
         [MethodImpl(MethodImplOptions.AggressiveInlining)]
-        public ApiMessage CallApi(ApiMessage request)
+        public ApiMessage CallApi(ApiMessage apiRequestMessage)
         {
             try
             {
-                var reply = CallApi(request.Package());
-                if (null == reply || reply.Count == 0)
+                AutoResetEvent mEvent = curAutoResetEvent;
+                mEvent.Reset();
+
+                try
+                {
+                    ApiMessage apiReplyMessage = null;
+
+                    CallApiAsync(apiRequestMessage.Package(), (apiReplyData) => {
+                        apiReplyMessage = new ApiMessage(apiReplyData);
+                        mEvent?.Set();
+                    });
+
+
+                    if (mEvent.WaitOne(requestTimeoutMs))
+                    {
+                        return apiReplyMessage;
+                    }
+                }
+                finally
                 {
-                    //Logger.Error(SsError.Err_Timeout.ToException());
-                    //返回请求超时,无回应数据
-                    return new ApiMessage().InitAsApiReplyMessageByError(SsError.Err_Timeout);
+                    mEvent = null;
                 }
-                return new ApiMessage(reply);
+
+
+                //Logger.Error(SsError.Err_Timeout.ToException());
+                //返回请求超时,无回应数据
+                return new ApiMessage().InitAsApiReplyMessageByError(SsError.Err_Timeout);
             }
             catch (Exception ex) when (!(ex.GetBaseException() is ThreadInterruptedException))
             {
                 ex = ex.GetBaseException();
 
                 Logger.Error(ex);
-       
+
                 return new ApiMessage().InitAsApiReplyMessageByError(ex);
             }
         }
+        #endregion
+
 
 
-        /// <summary>
-        /// 
-        /// </summary>
-        /// <param name="request"></param>
-        /// <returns></returns>
-        [MethodImpl(MethodImplOptions.AggressiveInlining)]
-        public async Task<ApiMessage> CallApiAsync(ApiMessage request)
-        {
-            ApiMessage reply = null;
-            await Task.Run(() => { reply = CallApi(request); });
-            return reply;
-        }
 
 
-        #endregion
 
 
         #region CallApi 扩展
@@ -159,6 +178,25 @@ namespace Sers.Core.Module.Api
         }
 
 
+        #endregion
+
+
+        #region CallApiAsync
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="request"></param>
+        /// <returns></returns>
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public async Task<ApiMessage> CallApiAsync(ApiMessage request)
+        {
+            ApiMessage apiReplyMessage = null;
+            await Task.Run(() => { apiReplyMessage = CallApi(request); });
+            return apiReplyMessage;
+        }
+
+
         /// <summary>
         /// 
         /// </summary>
@@ -171,15 +209,21 @@ namespace Sers.Core.Module.Api
         [MethodImpl(MethodImplOptions.AggressiveInlining)]
         public async Task<ReturnType> CallApiAsync<ReturnType>(string route, Object arg = null, string httpMethod = null, Action<RpcContextData> InitRpc = null)
         {
-            ReturnType ret = default(ReturnType);
-            await Task.Run(() => { ret = CallApi<ReturnType>(route, arg, httpMethod,InitRpc); });
+            ReturnType ret = default;
+            await Task.Run(() => { ret = CallApi<ReturnType>(route, arg, httpMethod, InitRpc); });
             return ret;
         }
 
+     
+
         #endregion
 
 
-        #endregion
+
+
+
+
+    
 
 
 

+ 9 - 6
dotnet/Library/Sers/Sers.ServiceStation/Sers.ServiceStation/ServiceStation.cs

@@ -261,16 +261,19 @@ namespace Sers.ServiceStation
 
 
             #region (x.4) 初始化ApiClient
-            ApiClient.SetOnSendRequest(communicationManage.organizeList.Select(organize=> organize.conn).Select<IOrganizeConnection, Func<Vit.Core.Util.Pipelines.ByteData, ArraySegment<byte>>>(
+            ApiClient.SetOnSendRequest(
+                communicationManage.organizeList.Select(organize=> organize.conn)
+                .Select<IOrganizeConnection, Action<ByteData, Action<ArraySegment<byte>>>>(
                 conn =>
                 {
-                    return (req) => {
-                        conn.SendRequest(req, out var reply);
-                        //if (reply == null) return default;
-                        return reply.ToArraySegment(); 
+                    return (requestData,callback) => {
+                        conn.SendRequestAsync(null, requestData,(sender,replyData)=> 
+                        {
+                            callback(replyData.ToArraySegment());
+                        });                         
                     };
                 }
-                ).ToArray());
+                ).ToArray(), communicationManage.requestTimeoutMs);
             #endregion
 
 

+ 1 - 50
dotnet/ServiceCenter/Sers.ServiceCenter/Sers.ServiceCenter/ApiCenter/ApiCenterService.cs

@@ -26,56 +26,7 @@ namespace Sers.ServiceCenter.ApiCenter
 
             CallApiAsync(requestMessage, sender, callback);
         }
-
-
-        #region CallApi
-
-
-        #region static curAutoResetEvent      
-        public static AutoResetEvent curAutoResetEvent =>
-            _curAutoResetEvent.Value ?? (_curAutoResetEvent.Value = new AutoResetEvent(false));
-
-        static System.Threading.ThreadLocal<AutoResetEvent> _curAutoResetEvent = new System.Threading.ThreadLocal<AutoResetEvent>();
-        #endregion
-
-
-        [MethodImpl(MethodImplOptions.AggressiveInlining)]
-        public bool CallApi(IOrganizeConnection  conn, ArraySegment<byte> apiRequest, out Vit.Core.Util.Pipelines.ByteData replyData, int requestTimeoutMs)
-        {
-            Vit.Core.Util.Pipelines.ByteData _replyData = null;
-
-            AutoResetEvent mEvent = curAutoResetEvent;
-            mEvent.Reset();
-
-            CallApiAsync(conn, null, apiRequest, (sender, replyData_) =>
-            {
-                _replyData = replyData_;
-                mEvent?.Set();
-            });
-
-            bool success;
-            try
-            {
-                success = mEvent.WaitOne(requestTimeoutMs);
-            }
-            finally
-            {
-                mEvent = null;
-            }
-
-            if (success)
-            {
-                replyData = _replyData;
-                return true;
-            }
-            else
-            {
-                replyData = null;
-                return false;
-            }
-        }
-        #endregion
-
+        
 
         #region interface
 

+ 9 - 14
dotnet/ServiceCenter/Sers.ServiceCenter/Sers.ServiceCenter/ServiceCenter.cs

@@ -105,15 +105,7 @@ namespace Sers.ServiceCenter
                 {
                     callback(sender_,apiReplyMessage.Package());
                 });
-            }
-
-            [MethodImpl(MethodImplOptions.AggressiveInlining)]
-            public bool SendRequest(Vit.Core.Util.Pipelines.ByteData requestData, out Vit.Core.Util.Pipelines.ByteData replyData)
-            {
-                Logger.Error(new NotImplementedException());
-                throw new NotImplementedException();
-            }
-
+            }            
 
 
             [MethodImpl(MethodImplOptions.AggressiveInlining)]
@@ -326,14 +318,17 @@ namespace Sers.ServiceCenter
 
 
             #region (x.6) 初始化ApiClient
-            Func<Vit.Core.Util.Pipelines.ByteData, ArraySegment<byte>> OnSendRequest = ((Vit.Core.Util.Pipelines.ByteData apiReqMessage) =>
+            Action<Vit.Core.Util.Pipelines.ByteData, Action<ArraySegment<byte>>> OnSendRequest = ((apiRequestMessage,callback) =>
             {
-                apiCenterService.CallApi(connForLocalStationService, apiReqMessage.ToArraySegment(),
-                    out var replyData, communicationManage.requestTimeoutMs);
-                return replyData.ToArraySegment();
+                apiCenterService.CallApiAsync(connForLocalStationService, null, apiRequestMessage.ToArraySegment(),
+                    (sender, replyData) =>
+                    {
+                        callback(replyData.ToArraySegment());
+                    }
+                 );                
             });
 
-            ApiClient.SetOnSendRequest(new[] { OnSendRequest });
+            ApiClient.SetOnSendRequest(new[] { OnSendRequest },communicationManage.requestTimeoutMs);
             #endregion
 
 

+ 2 - 2
dotnet/ServiceStation/Demo/StressTest/App.Robot.Station/Logical/Model/Task.cs

@@ -27,9 +27,9 @@ namespace App.Robot.Station.Logical.Model
 
         public bool IsRunning => tasks.IsRunning;
  
-        public int targetCount => config.threadCount*config.loopCountPerThread;
+        public int targetCount => config.threadCount * config.loopCountPerThread;
 
-        public int sumCount= 0;
+        public int sumCount = 0;
         public int sumFailCount = 0;
 
         public int curCount=0;