private async Task <bool> SendRPC(RPCSend send, CancellationToken token) { var reqHeader = new RequestHeader { CallId = send.RPC.CallId, MethodName = send.RPC.Name, RequestParam = true }; while (_idRPCDict.ContainsKey(send.RPC.CallId) == false) { _idRPCDict.TryAdd(send.RPC.CallId, send); } var payload = send.RPC.Serialize(); var payloadLen = ProtoBufEx.EncodeVarint((ulong)payload.Length); var headerData = reqHeader.ToByteArray(); var buf = new byte[4 + 1 + headerData.Length + Math.Max(1, payloadLen.Length) + payload.Length]; BinaryPrimitives.WriteUInt32BigEndian(buf, (uint)(buf.Length - 4)); buf[4] = (byte)headerData.Length; headerData.CopyTo(buf, 5); payloadLen.CopyTo(buf, 5 + headerData.Length); payload.CopyTo(buf, 5 + headerData.Length + payloadLen.Length); return(await Write(buf, token)); }