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); }
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));; }