protected async void StartHeartbeatAsync()
        {
            Thrift.NetworkService.Client networkClient = null;
            while (true)
            {
                networkClient = NetworkServiceClient;

                try
                {
                    if (networkClient != null)
                    {
                        //long millisecond = DateTime.UtcNow.Ticks / TimeSpan.TicksPerMillisecond;
                        //DateTimeOffset.
                        TimeSpan t         = (DateTime.UtcNow - new DateTime(1970, 1, 1));
                        long     timestamp = (long)t.TotalSeconds;

                        //LogService.Logger.Log(LogService.LogType.LT_DEBUG, "heartbeat await start");
                        long local = await Task.Factory.FromAsync(networkClient.send_heartbeat(null, null, timestamp), (asyncResult) =>
                        {
                            //LogService.Logger.Log(LogService.LogType.LT_DEBUG, "heartbeat end call begin ");
                            long ret = networkClient.End_heartbeat(asyncResult);
                            //LogService.Logger.Log(LogService.LogType.LT_DEBUG, "heartbeat end call end ");
                            return(ret);
                        });//networkClient.End_heartbeat);

                        //LogService.Logger.Log(LogService.LogType.LT_DEBUG, "heartbeat await end resul " + local.ToString());

                        //long local = await ClientSend<XLN.Game.Common.Thrift.NetworkService.Client, long>(
                        //    (client) => { return Task.Factory.FromAsync(client.send_heartbeat(null, null, 1000), client.End_heartbeat); }, null, null, 1000);
                        //LogService.Logger.Log(LogService.LogType.LT_DEBUG, "heartbeat await end resul " + local.ToString());
                    }
                }
                catch (TTransportException ex)
                {
                    LogService.Logger.Log(LogService.LogType.LT_WARNING, ex.ToString());
                    await Task.Factory.StartNew(() =>
                    {
                        ClearConnection();
                        m_DisConnectedAction();
                    }, CancellationToken.None, TaskCreationOptions.None, ApplicationContext.MainScheduler);
                }
                catch (Exception ex)
                {
                    LogService.Logger.Log(LogService.LogType.LT_WARNING, ex.ToString());
                    //throw ex;
                }

                //send heartbeat every 10 seconds
                await Task.Delay(5000);
            }
        }
        public virtual async Task <ConnectionResult> StartConnect()
        {
            if (m_ServerConfig == null)
            {
                return(new ConnectionResult(false, new NetworkServieException("Server config not set")));
            }

            //if(m_ConnectionTask != null && !m_ConnectionTask.IsCompleted)
            //{
            //    LogService.Logger.Log(LogService.LogType.LT_WARNING, "connection task not complete yet");
            //    return new ConnectionResult(false, new NetworkServieException("connection task not complete yet"));
            //}
            //
            TAsyncSystemSocket socket = new TAsyncSystemSocket(m_ServerConfig.IP, m_ServerConfig.Port);

            socket.Timeout = 10000;
            THeaderTransport transport = new THeaderTransport(socket);

            try
            {
                await transport.OpenAsync();
            }catch (TTransportException t)
            {
                m_ConnectionErrorAction(t);
                return(new ConnectionResult(false, t));
            }

            /*
             * var task = Task.Factory.StartNew(() =>
             * {
             *  TAsyncSocket socket = new TAsyncSocket(m_ServerConfig.IP, m_ServerConfig.Port);
             *  socket.Timeout = 10000;
             *  TTransport transport = new THeaderTransport(socket);
             *  AutoResetEvent barrier = new AutoResetEvent(false);
             *
             *  TTransportException tException = new TTransportException("Connection Timeout");
             *
             *  socket.connectHandler += (object sender, System.Net.Sockets.SocketAsyncEventArgs e) =>
             *  {
             *
             *      if(e.SocketError == SocketError.Success)
             *      {
             *           tException = null;
             *      }
             *      else
             *      {
             *          tException = new TTransportException(e.SocketError.ToString());
             *      }
             *      barrier.Set();
             *  };
             *  //TODO this also set the recevie timeout..which could be not we wanted
             *
             *  transport.Open();
             *  barrier.WaitOne(10000);
             *  TTransportException ex = tException;
             *  if(ex != null)
             *  {
             *      LogService.Logger.Log(LogService.LogType.LT_ERROR, ex.Message);
             *      transport.Close();
             *      transport = null;
             *      throw ex;
             *  }
             *  return transport;
             * });
             */
            /*
             * m_ConnectionTask = task.ContinueWith((t)=>{
             *
             *  if (t.IsCompleted)
             *  {
             *      if (t.IsFaulted)
             *      {
             *          m_ConnectionErrorAction(t.Exception);
             *          return new ConnectionResult(false, t.Exception);
             *          //throw t.Exception;
             *      }
             *      else if(t.IsCanceled)
             *      {
             *          return new ConnectionResult(false, new NetworkServieException("connection task Cancelled"));
             *      }
             *      else
             *      {
             *          var transport = t.Result;
             *
             *          m_Transport = transport;
             *          TProtocol protocol = new THeaderProtocol((THeaderTransport)m_Transport, THeaderProtocol.PROTOCOL_TYPES.T_BINARY_PROTOCOL);
             *          m_NetworkServiceClient = new Thrift.NetworkService.Client(protocol);;
             *          m_ActorServiceClient = new Thrift.ActorService.Client(protocol);
             *
             *          m_ConnectedAction(m_Transport);
             *          return new ConnectionResult(true, null);
             *
             *      }
             *  }
             *  return new ConnectionResult(false, null);;
             *
             *
             * }, ApplicationContext.MainScheduler);
             */

            m_Transport = transport;
            TProtocol protocol = new THeaderProtocol((THeaderTransport)m_Transport, THeaderProtocol.PROTOCOL_TYPES.T_BINARY_PROTOCOL);

            m_NetworkServiceClient = new Thrift.NetworkService.Client(protocol);;
            m_ActorServiceClient   = new Thrift.ActorService.Client(protocol);

            m_ConnectedAction(m_Transport);

            return(new ConnectionResult(true, null));;
        }