/// <summary>
        ///     request asynchronous
        ///     ordered by "serial"
        /// </summary>
        /// <param name="serial"></param>
        /// <param name="pack"></param>
        /// <returns></returns>
        private async Task <RpcResult> RequestAsync(ushort serial, RpcPackage pack)
        {
            var tcs = new TaskCompletionSource <RpcResult>();

            //  call back in logic service
            Action <bool, byte[]> cb =
                (b, bytes) => GlobalVarPool.Ins.Service.Perform(() =>
            {
                tcs.SetResult(new RpcResult(b, bytes));
            });

            // callback pool
            if (!_requestPool.TryAdd(serial, cb))
            {
                Logger.Ins.Error("Request of serial {0} already processing!", serial);
                return(RpcResult.Failure);
            }

            // send
            var sendRet = await SendAsync(PiSerializer.Serialize(pack));

            if (!sendRet)
            {
                Action <bool, byte[]> _;
                _requestPool.TryRemove(serial, out _);
                _ = _ ?? cb;

                _(false, null);
            }

            return(await tcs.Task);
        }
        private async Task <RpcResult> Response(bool success, byte[] data, ushort serial)
        {
            var pack = new RpcPackage
            {
                Type    = ERpc.Response,
                Serial  = serial,
                Success = success,
                Data    = data,
            };

            return(await SendAsync(PiSerializer.Serialize(pack)));
        }