示例#1
0
        public Task ClientSend <Client>(Func <Client, Task> thriftAction, Action <Task> onSuccess,
                                        Action <Task> onFail, int timeoutMillis)
        {
            Task task = null;

            task = Task.Factory.StartNew(async() =>
            {
                try
                {
                    TProtocol protocol = new THeaderProtocol((THeaderTransport)m_Transport, THeaderProtocol.PROTOCOL_TYPES.T_BINARY_PROTOCOL);
                    Client client      = XLN.Game.Common.Utils.ClassUtils.CreateInstance <Client>(protocol);
                    await thriftAction(client);

                    //if (onPostTransport != null)
                    //    onPostTransport(task);
                }
                catch (Exception e)
                {
                    throw e;
                }
            }, CancellationToken.None, TaskCreationOptions.None, TaskScheduler.Default)
                   .ContinueWith((t) =>
            {
                if (t.Exception == null)
                {
                    if (onSuccess != null)
                    {
                        onSuccess(t);
                    }
                }
                else
                {
                    if (onFail != null)
                    {
                        onFail(t);
                    }
                }
            }, ApplicationContext.MainScheduler);

            return(task);
        }
示例#2
0
        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));;
        }